生产者消费者主线程在其他线程运行时退出

时间:2014-11-25 08:55:39

标签: java multithreading threadpool executorservice

我的代码段:

public class ProducerConsumerTest {

  public static void main(String[] args)
  {
    ArrayBlockingQueue<String> sharedQueue = new ArrayBlockingQueue<String>(20, true);

    ExecutorService consumerService = Executors.newFixedThreadPool(5);
    ExecutorService producerService = Executors.newSingleThreadExecutor();

    Future future=producerService.submit(new Producer(sharedQueue));

    consumerService.execute(new Consumer(sharedQueue));
    consumerService.execute(new Consumer(sharedQueue));
    consumerService.execute(new Consumer(sharedQueue));
    consumerService.execute(new Consumer(sharedQueue));
    consumerService.execute(new Consumer(sharedQueue));
  }
}

如何让主线程等待其他线程?

我面临的问题是我不知道ExecutorService创建的主题的名称,这就是我无法使用join()的原因。例如:t1.join()中的main()

4 个答案:

答案 0 :(得分:1)

为什么不试试障碍?

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html

PS。我认为他们的工作来自JAVA7及以上

答案 1 :(得分:1)

您可以尝试使用CountDownLatch。它将满足您的要求,您需要做的是,创建一个CountDownLatch实例,其count value等于线程数。启动所有线程并在主线程中调用await方法。在所有线程中都有CountDownLatch对象引用,并在完成自己的作业后调用每个线程中的countDown方法。对于每个countDown方法,CountDownLatch计数值将减少。一旦达到zero,调用await的方法就会被唤醒。 Note if any one of your thread fails to call countDown then await will never get wake-up

试试这个以供参考, http://www.java-redefined.com/p/java-count.html

答案 2 :(得分:1)

你可以使用countdownlatch并等待所有线程完成执行,或者你可以使用consumerService.awaitTermination()和producerService.awaitTermination();

答案 3 :(得分:0)

可能是一个重复的问题:How to wait for all threads to finish, using ExecutorService?

但是,请在主方法中添加以下行。

关闭(); //您可能想要处理SecurityException awaitTermination(Long.MAX_VALUE,TimeUnit.NANOSECONDS); //处理exceptinos。

更多:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html