我有多个任务/ 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
答案 0 :(得分:4)
ExecutorService
BlockingQueue
为您处理队列。您所要做的就是将Runnable
提交给ExecutorService。它会坚持下去。如果有任何打开的线程,它将立即运行它。否则,它将等待另一个Runnables
中的一个完成执行。一旦完成,它将采用下一个。
如果您查看Executors#newFixedThreadPool的源代码,它实际上只会创建ThreadPoolExecutor
nThreads
个LinkedBlockingQueue
个线程,由public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
支持,如下所示:
Resolve