1

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

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

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

//doing something else

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

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

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

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

有谁知道最有效地解决我的问题?

4

2 回答 2

2

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

  1. 使主线程在所有其他线程上调用 join()。join() 在线程完成或已经完成时返回
  2. 创建一个初始化为 N 的 CountDownLatch,将此锁存器传递给所有线程,countDown()在锁存器完成后让每个线程调用锁存器,并在锁存器上进行主线程调用await()。第二种技术比第一种更难,但也更灵活和可重用,并且允许在延迟后唤醒,即使 N 个线程还没有完成。
于 2012-04-19T08:54:26.017 回答
0

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

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

  • 主线程从队列中获取消息并计算它们。当消息数等于线程数时,所有线程都已完成。

于 2012-04-19T09:25:42.403 回答