首页 文章

Java 生产环境 者/消费者,检测处理结束

提问于
浏览
3

我正在准备一个应用程序,其中一个 生产环境 者生成数百万个任务,然后由可配置数量的消费者处理 . 从 生产环境 者到消费者的通信(可能)将基于队列 .

从运行 生产环境 者/生成任务的线程,我可以使用什么方法等待所有任务的完成?我宁愿不恢复任何定期轮询,看看我的任务队列是否为空 . 在任何情况下,任务队列为空并不能保证最后的任务已完成 . 这些任务可能运行时间相对较长,因此在消费者线程仍处于愉快处理状态时,队列很可能是空的 .

Rgds,Maarten

4 回答

  • 1

    您可能想要查看java.util.concurrent包 .

    执行程序框架已经提供了通过线程池执行任务的方法 . 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();
        }
    

    Edit: Alternative Version using 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;
            }
        };
    
  • 0

    您想知道每个任务的完成位置 . 我会有另一个完成任务报告的队列 . (每个任务一个对象/消息)当此计数达到您创建的任务数时,它们都已完成 . 此任务报告还可以包含任务的任何错误和计时信息 .

  • 3

    您可以让每个使用者检查队列在出队时是否为空,如果是,则在主线程等待的时候脉冲condvar(或监视器,因为我相信这就是Java所拥有的) .

    让线程检查全局布尔变量(标记为volatile)是一种让线程知道它们应该停止的方法 .

  • 1

    你可以为每个线程使用join()方法..所以在完成所有线程之前你的主线程不会结束!通过这种方式,您实际上可以找出所有线程是否已完成!

相关问题