编程语言
首页 > 编程语言> > Java生产者/消费者,检测处理结束

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