java threads:producer - consumer

时间:2012-04-19 08:46:14

标签: java multithreading design-patterns

我有一些发展要做,我试着看看是否有一个设计模式可供使用。 问题很简单:

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

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

//doing something else

因此,如您所见,while循环一直运行,直到没有线程运行。

我正在思考模式生产者 - 消费者,我想做类似的事情:

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

我尝试在互联网上搜索,但我找不到与我的问题相符的东西。

有谁知道解决问题的效率最高?

2 个答案:

答案 0 :(得分:2)

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

  1. 在所有其他线程上使主线程调用join()。 join()在线程完成或已经完成时返回
  2. 创建一个初始化为N的CountDownLatch,将此锁存器传递给所有线程,在锁存器完成时使每个线程调用countDown(),并使锁存器上的主线程调用await()。第二种技术比第一种技术稍微硬一点,但也更灵活,可重复使用,并允许在延迟后唤醒,即使N个线程还没有完成。

答案 1 :(得分:0)

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

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

  • 主线程从队列中获取消息并对其进行计数。当消息数等于线程数时,所有线程都已完成。