我正在运行一些异步任务,我的一个用户正在使用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);
这里有两个问题真的..
我想帮助理解异常的第一行:
ThreadPoolExecutor @ f5f25ac [正在运行,池大小= 9,活动线程= 9,排队任务= 128,已完成任务= 240]
池大小与活动线程vs四元组任务..我假设我执行的任务太多,但我不确定如何确定这三个变量。如果有人可以为我打破这一点,我很感激。
如果我的线程用完了,我应该增加允许的数量,如果是这样,或者是否有更好的解决方案。
自定义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);
}
}
答案 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次 - 而且,坦率地说,这个数字看起来很疯狂 - 那么就改变你的代码以避免这样做,例如取消你不再需要的任务。