简单线程pipe理 – Java – Android

我有一个应用程序产生一个新的线程,当用户要求一个图像被过滤。

这是我拥有的唯一types的任务,同样重要。

如果我要求太多的并发线程(最多我想要是9)线程pipe理器抛出一个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); } } 

只需将被拒绝的任务添加到队列中,下一次启动线程时,将检查队列以查看是否有积压。

与此明显的问题是,如果最终任务在第一次尝试时被拒绝,它将永远不会被重新启动(直到不再需要它之前)。

只是想知道是否有一个简单的模型,我应该用来pipe理这种事情。 我需要任务通知队列,当他们完成,所以我知道有空间,但我不知道如何。

亲切的问候,

加文

Solutions Collecting From Web of "简单线程pipe理 – Java – Android"

RejectedExecutionException的原因是因为AsyncTask实现了一个自己的线程池(根据Martelli先生的回答),但是最多只能同时执行10个任务。 为什么他们有这个限制,我不知道。

因此,有一种可能性是你克隆AsyncTask ,提高限制(或无限制,这也可能与LinkedBlockingQueue ),并使用你的克隆。 然后,也许,将更改作为补丁提交给未来Android版本的AsyncTask

点击这里运行一个谷歌代码searchAsyncTask – 第一击应该是实施。

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

您似乎已经实现了线程池devise模式的一个版本 – 维基百科文章指出了有关该主题的许多有用的文章,这可能会帮助您优化您的实现。 我也推荐这个具有明确的代码和解释的Java特定的文章 。

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