我有一个应用程序,当用户要求过滤图像时会生成一个新线程。
这是我唯一的任务类型,所有任务都同等重要。
如果我请求过多的并发线程(我想要的最大值是 9),线程管理器会抛出一个 RejectedExecutionException。
此刻我所做的是;
// Manage Concurrent Tasks
private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>();
@Override
public int remainingSize() {
return tasks.size();
}
@Override
public void addTask(AsyncTask<Bitmap, Integer, Integer> task) {
try{
task.execute(currentThumbnail);
while(!tasks.isEmpty()){
task = tasks.remove();
task.execute(currentThumbnail);
}
} catch (RejectedExecutionException r){
Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue");
tasks.add(task);
}
}
只需将被拒绝的任务添加到队列中,下次启动线程时,将检查队列以查看是否存在积压。
这个明显的问题是,如果最终任务在第一次尝试时被拒绝,它将永远不会重新启动(直到不再需要它之后)。
只是想知道我是否应该使用一个简单的模型来管理这类事情。我需要任务在完成时通知队列。
最佳答案
RejectedExecutionException
的原因是因为 AsyncTask
实现了自己的线程池(根据 Martelli 先生的回答),但线程池的上限为 10同时执行的任务。为什么他们有这个限制,我不知道。
因此,一种可能性是您克隆 AsyncTask
,提高限制(或不受限制,这对于 LinkedBlockingQueue
也是可能的),然后使用您的克隆。然后,或许可以将更改作为补丁提交给 AsyncTask
,以供将来的 Android 版本使用。
点击here为 AsyncTask
运行 Google 代码搜索——第一个命中应该是实现。
如果您只想提高限制,请将 MAXIMUM_POOL_SIZE
调整为您可能需要的大小。如果您想不受限制,请使用零参数 LinkedBlockingQueue
构造函数,而不是目前使用的构造函数。 AFAICT,其余代码可能保持不变。
关于java - 简单的线程管理 - Java - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/990948/