需要帮助了解'RejectedExecutionExemption'

时间:2017-02-02 17:12:12

标签: android android-asynctask threadpool

我正在运行一些异步任务,我的一个用户正在使用RejectedExecutionExemption崩溃:

堆栈跟踪

stackTrace: java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@5e2675f rejected from java.util.concurrent.ThreadPoolExecutor@f5f25ac[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 240]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2014)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:794)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1340)
    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:607)

导致异常的行

 new SetDownloadStatusTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

这里有两个问题真的..

  1. 我想帮助理解异常的第一行:

    ThreadPoolExecutor @ f5f25ac [正在运行,池大小= 9,活动线程= 9,排队任务= 128,已完成任务= 240]

    池大小与活动线程vs四元组任务..我假设我执行的任务太多,但我不确定如何确定这三个变量。如果有人可以为我打破这一点,我很感激。

  2. 如果我的线程用完了,我应该增加允许的数量,如果是这样,或者是否有更好的解决方案。

  3. 自定义AsyncTask

    private class SetDownloadStatusTask extends AsyncTask<Void, Void, DownloadStatus> {
    
            @Override
            protected DownloadStatus doInBackground(Void... params) {
                return bookDownloadManager.status(product);
            }
    
    
            @Override
            public void onPostExecute(DownloadStatus downloadStatus) {
                updateMenuForDownloadStatus(downloadStatus);
            }
        }
    

1 个答案:

答案 0 :(得分:3)

  

我假设我正在执行太多任务

正确。

  

如果有人可以为我打破这一点,我很感激

在四核CPU上,

AsyncTask.THREAD_POOL_EXECUTOR将支持九个并行线程(pool size = 9)。这是由最大长度为128的LinkedBlockingQueue支持。并且,您已经请求了第138个同步任务,因此我们没有线程(active threads = 9)并且队列已满(queued tasks = 128

  

我应该增加允许的数量,如果是这样,或者是否有更好的解决方案

你应该问自己“为什么以一切圣洁的名义,我试图一次下载138件事情?”。

如果有合法需要,请使用您自己的自定义Executor,而不是THREAD_POOL_EXECUTOR。如果没有合法需要同时下载138次 - 而且,坦率地说,这个数字看起来很疯狂 - 那么就改变你的代码以避免这样做,例如取消你不再需要的任务。