简单线程管理-Java-Android
我有一个应用程序,当用户要求过滤图像时,它会生成一个新线程 这是我唯一的任务类型,所有任务都同等重要 如果我请求太多并发线程(我想要的最大值是9),线程管理器将抛出一个拒绝执行异常 此刻我所做的是简单线程管理-Java-Android,java,android,multithreading,Java,Android,Multithreading,我有一个应用程序,当用户要求过滤图像时,它会生成一个新线程 这是我唯一的任务类型,所有任务都同等重要 如果我请求太多并发线程(我想要的最大值是9),线程管理器将抛出一个拒绝执行异常 此刻我所做的是 // Manage Concurrent Tasks private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer&g
// 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);
}
}
//管理并发任务
专用队列任务=新建LinkedList();
@凌驾
公共整数剩余大小(){
返回任务。size();
}
@凌驾
公共void addTask(异步任务){
试一试{
执行(当前缩略图);
而(!tasks.isEmpty()){
task=tasks.remove();
执行(当前缩略图);
}
}捕获(拒绝执行异常r){
i(标记,“捕获的RejectedExecutionException异常-将任务添加到队列”);
任务。添加(任务);
}
}
只需将被拒绝的任务添加到队列中,下一次启动线程时,将检查队列是否有积压工作
明显的问题是,如果最终任务在第一次尝试时被拒绝,它将永远不会重新启动(直到不再需要它之后)
只是想知道是否有一个简单的模型我应该用来管理这类事情。我需要任务在完成时通知队列。您似乎已经实现了设计模式的一个版本——wikipedia的文章指出了许多关于这个主题的有用文章,这些文章可能会帮助您改进实现。我还建议使用代码和解释清晰的线程池。拒绝执行异常的原因是
AsyncTask
实现了自己的线程池(根据Martelli先生的回答),但最多可以同时执行10个任务。我不知道他们为什么会有这样的限制
因此,您可以克隆AsyncTask
,提高限制(或无限制,这在LinkedBlockingQueue
中也是可能的),并使用克隆。然后,也许可以将更改作为补丁提交到AsyncTask
,以备将来的Android版本使用
单击以运行Google代码搜索AsyncTask
——第一个目标应该是实现
如果您只是想提高限制,请将
最大池大小调整为您可能需要的大小。如果您想要无界,请使用零参数LinkedBlockingQueue
构造函数,而不是当前使用的构造函数。在AICT中,代码的其余部分可能保持不变。也许一个选项是让任务在阻塞队列(位图)上等待,而不是将位图作为参数,但您必须添加一种方式使任务终止。限制不再是10。这一限制之所以设立,是因为异步任务并不意味着一打就可以完成。由于这样一个任务的目标是更新UI,因此如果有几十个线程导致更新,那将是非常糟糕的。根据@Grantland Chew,目前的限制是5个并行线程:不,首先是5个。它可以发展到更高的水平。