【问题标题】:java threads : producer - consumerjava线程:生产者-消费者
【发布时间】:2012-04-30 18:17:33
【问题描述】:

我有一些开发工作要做,我尝试看看是否有设计模式可以使用。 问题很简单:

我有一个启动许多线程的主线程。主线程必须等待每个线程完成,然后执行其他操作。 现有的代码有点难看。我有一个 while 循环来检查线程组以查看是否正在运行:

//launch threads
.....
//wait for threads to finish
while (ThreadRepository.getInstance().isActiveThreadGroup(myGroupId)) {
    Thread.sleep(5000);
}

//doing something else

所以,如您所见,while 循环会一直运行,直到没有线程在运行。

我正在考虑模式生产者-消费者,我想做这样的事情:

例如使用一些 BlockingQueue,每个线程都会在其中放入(或获取)一些东西。 而不是有时间和睡眠,我想有类似的东西 myQueue.take() 但要等待队列为空。 为空时,表示没有线程在运行。

我尝试在 Internet 上搜索,但没有找到与我的问题相符的内容。

有谁知道解决我的问题最有效的方法吗?

【问题讨论】:

  • 如果提前确定了广告数量,可以使用CountDownLatch。
  • Marko,“不回报贡献者的青睐”是什么意思?

标签: java multithreading design-patterns


【解决方案1】:

有两种简单的方法可以让一个线程等待 N 个线程完成:

  1. 让主线程在所有其他线程上调用join()。 join() 在线程完成或已经完成时返回
  2. 创建一个初始化为N的CountDownLatch,将这个latch传递给所有线程,让每个线程在latch上调用countDown(),当它完成时,让主线程在latch上调用await()。第二种技术比第一种更难,但也更灵活和可重用,并且允许在延迟一段时间后唤醒,即使 N 个线程还没有完成。

【讨论】:

  • 谢谢。我不知道这门课。这正是我需要的。我已经测试过了,它就像一个魅力。
【解决方案2】:

您可以按如下方式使用 BlockingQueue:

  • 每个子线程在完成后将一条消息放入队列

  • 主线程从队列中获取消息并计数。当消息数等于线程数时,所有线程都结束了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2013-11-17
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多