如何在Android中管理Runnable任务的队列

时间:2016-08-17 13:35:55

标签: java android multithreading design-patterns

我有多个任务/ Runnable(即从互联网下载图像),这些任务是在用户滚动浏览Android应用程序中的列表时生成的。

我无法控制一次生成多少个任务/ Runnable,这可能在100个。但是我想并行执行n(10)个任务。所以,我打算构建一个设计,只要生成一个新任务/ runnable,它就会被添加到队列(List<Runnable>)并通过Executors.newFixedThreadPool(10),我将只执行前10个并行运行任务。现在,一旦任务/ Runnable完成,我应该能够从队列(List<Runnable>)中删除它们,并且应该能够在FIFO中执行队列中的新任务/ Runnable。

我有两个类用于此设计。首先是ExecutorManager,它是一个单例类,管理10个并行任务的执行,第二个是实现ImageDownloader的{​​{1}}类,负责下载图像。我不确定通知runnable任务/下载完成的最佳方法是什么,它可以从队列中执行新任务。我正在关注FIFO,所以我将始终从队列中的前10个任务开始执行,但是我将如何知道哪个任务已完成以及哪个任务要从队列中删除?

ExecutorManager

1 个答案:

答案 0 :(得分:4)

嗯,你好运。你不必告诉ExecutorManager任何东西。 ExecutorService BlockingQueue为您处理队列。您所要做的就是将Runnable提交给ExecutorService。它会坚持下去。如果有任何打开的线程,它将立即运行它。否则,它将等待另一个Runnables中的一个完成执行。一旦完成,它将采用下一个。

如果您查看Executors#newFixedThreadPool的源代码,它实际上只会创建ThreadPoolExecutor nThreadsLinkedBlockingQueue个线程,由public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } 支持,如下所示:

Resolve