Java 线程:生产者 - 消费者



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

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

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

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

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

例如,使用一些 BlockingQueue,每个线程在其中放置(或获取)一些东西。与其有一会儿睡觉,我更想有这样的东西 myQueue.take(),但要等待队列为空的东西。如果为空,则表示没有线程运行。

尝试在互联网上搜索,但没有找到与我的问题相匹配的东西。

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

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

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

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

  • 完成后,每个子线程都会在队列中放置一条消息

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

最新更新