【问题标题】:Producer Consumer Main Thread exits while other threads are running [duplicate]生产者消费者主线程在其他线程运行时退出[重复]
【发布时间】:2015-01-23 04:42:18
【问题描述】:

我的代码 sn-p:

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() in main()

【问题讨论】:

  • 您期望从生产者服务中获得一些东西,但没有消费它?那么future.get()呢?还想知道为什么要等待主线程共存?如果您保存生产者/消费者的引用而不是在执行调用中释放它们,则可以拥有线程的引用。
  • 你在 Web 应用程序中创建这个吗?
  • @OO7 不,这是一个普通的独立应用程序。
  • 你的问题定义到底是什么?你会用它更新你的问题吗?以便更清楚地回答。
  • 如果主线程有任务要执行,该任务会影响是否以及如何等待。但如果主线程无事可做,就让它结束吧。阻止相关资源没有任何好处。

标签: java multithreading threadpool executorservice


【解决方案1】:

你为什么不试试障碍?

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

PS。我认为他们在 JAVA7 及更高版本上工作

【讨论】:

    【解决方案2】:

    你可以试试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

    【讨论】:

    • 谢谢!!为我工作。
    【解决方案3】:

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

    【讨论】:

    • 谢谢!!为我工作。
    【解决方案4】:

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

    但是,请将以下几行添加到您的 main 方法中。

    关机(); // 你可能想要处理 SecurityException awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 处理异常。

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

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 2018-09-24
      • 2017-02-01
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多