简单的线程管理 – Java – Android

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

这是我所拥有的唯一types的任务,并且所有任务都同等重要。

如果我要求太多并发线程(Max我想要的是9),线程管理器会抛出RejectedExecutionException

在那一刻,我所做的是;

// Manage Concurrent Tasks private Queue<AsyncTask> tasks = new LinkedList<AsyncTask>(); @Override public int remainingSize() { return tasks.size(); } @Override public void addTask(AsyncTask 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版本。

点击此处运行AsyncTask的Google Code Search – 第一个应该是实施。

如果您只想提高限制,请将MAXIMUM_POOL_SIZE调整为您可能需要的大小。 如果您想要无限制,请使用零参数LinkedBlockingQueue构造函数,而不是当前使用的构造函数。 AFAICT,其余代码可能保持不变。

您似乎已经实现了Thread Pool设计模式的一个版本 – 维基百科文章指向了许多有关该主题的有用文章,这可能有助于您优化您的实现。 我还推荐这篇特定于Java的文章 ,其中包含清晰的代码和解释。

也许一个选项是让任务等待阻塞队列(位图)而不是将位图作为参数,但是你必须为任务添加一种终止方法。