简单线程管理-Java-Android

简单线程管理-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

我有一个应用程序,当用户要求过滤图像时,它会生成一个新线程

这是我唯一的任务类型,所有任务都同等重要

如果我请求太多并发线程(我想要的最大值是9),线程管理器将抛出一个拒绝执行异常

此刻我所做的是

// 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个。它可以发展到更高的水平。