我的代码段:
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()
。
答案 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
。
答案 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