java Producer Consumer主线程在其他线程运行时退出
我的代码片段:
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()
# 1 楼答案
你可以试试
CountDownLatch
。它将完全满足您的需求,您需要做的是,创建一个count value
等于线程数的CountDownLatch实例。启动所有线程并在主线程中调用await
方法。在所有线程中都有CountDownLatch对象引用,并在完成自己的作业后在每个线程中调用countDown
方法。对于每种倒计时方法,CountDownLatch计数值都将递减。一旦到达zero
,调用wait的方法将被唤醒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 楼答案
可能是重复的问题:How to wait for all threads to finish, using ExecutorService?
但是,在主方法中添加以下行
shutdown();//您可能需要处理SecurityException 等待终止(Long.MAX_值,时间单位纳秒);//处理例外情况
更多:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
# 3 楼答案
您可以使用countdownlatch并等待所有线程完成执行,也可以使用consumerService。等待终止()和producerService。等待终止()
# 4 楼答案
你为什么不试试障碍呢
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html
另外,我认为它们是从JAVA7和更高版本开始工作的