Java生产者/消费者,检测处理结束
作者:互联网
我正在准备一个应用程序,其中一个生产者生成数百万个任务,然后由可配置数量的消费者处理.从生产者到消费者的通信(可能)将基于队列.
从运行生产者/生成任务的线程,我可以使用什么方法等待所有任务的完成?我宁愿不恢复任何定期轮询,看看我的任务队列是否为空.在任何情况下,任务队列为空并不能保证最后的任务已完成.这些任务可能运行时间相对较长,因此在消费者线程仍处于愉快处理状态时,队列很可能是空的.
Rgds,Maarten
解决方法:
您可能想要查看java.util.concurrent包.
> ExecutorService
> Executors
> Future
执行程序框架已经提供了通过线程池执行任务的方法. Future抽象允许等待任务的完成.
将两者放在一起可以让您轻松协调执行,解耦任务,活动(线程)和结果.
例:
ExecutorService executorService = Executors.newFixedThreadPool(16);
List<Callable<Void>> tasks = null;
//TODO: fill tasks;
//dispatch
List<Future<Void>> results = executorService.invokeAll(tasks);
//Wait until all tasks have completed
for(Future<Void> result: results){
result.get();
}
编辑:使用CountDownLatch的替代版本
ExecutorService executorService = Executors.newFixedThreadPool(16);
final CountDownLatch latch;
List<Callable<Void>> tasks = null;
//TODO: fill tasks;
latch = new CountDownLatch(tasks.size());
//dispatch
executorService.invokeAll(tasks);
//Wait until all tasks have completed
latch.await();
在你的任务中:
Callable<Void> task = new Callable<Void>()
{
@Override
public Void call() throws Exception
{
// TODO: do your stuff
latch.countDown(); //<---- important part
return null;
}
};
标签:producer-consumer,java,task,queue 来源: https://codeday.me/bug/20190902/1792202.html