我有一些开发工作要做,我尝试看看是否有可以使用的设计模式。问题很简单:
我有一个主线程可以启动许多踏板。主线程必须等待每个线程完成,然后执行其他操作。现有的代码有点丑。我有一个 while 循环,用于检查线程组以查看是否有正在运行的内容:
//launch threads
.....
//wait for threads to finish
while (ThreadRepository.getInstance().isActiveThreadGroup(myGroupId)) {
Thread.sleep(5000);
}
//doing something else
因此,如您所见,while 循环一直运行,直到没有线程运行。
我在模式生产者-消费者那里思考,我想做这样的事情:
例如,使用一些 BlockingQueue,每个线程在其中放置(或获取)一些东西。与其有一会儿睡觉,我更想有这样的东西 myQueue.take()
,但要等待队列为空的东西。如果为空,则表示没有线程运行。
尝试在互联网上搜索,但没有找到与我的问题相匹配的东西。
有谁知道最有效的方法来解决我的问题?
有两种简单的方法可以让一个线程等待 N 个线程完成:
- 让主线程在所有其他线程上调用 join()。 join() 在线程完成或已经完成时返回
- 创建一个初始化为 N 的 CountDownLatch,将此闩锁传递给所有线程,使每个线程调用在闩锁完成后
countDown()
闩锁上,并使主线程调用await()
在闩锁上。第二种技术比第一种技术难一些,但也更灵活和可重用,并且允许在一段时间延迟后被唤醒,即使 N 线程尚未完成。
您可以按如下方式使用 BlockingQueue:
-
完成后,每个子线程都会在队列中放置一条消息
-
主线程从队列中获取消息并对其进行计数。当消息数等于线程数时,所有线程都已完成。