如何为大量嵌套的生产者 - 消费者同步整体消费者完成情况?
例如,让我们说你有一个" USPS"系统实施:
Backoffice.start
函数,启动Runnable
我的SubOffice对象中的SubOffice.startMailProcessing
SubOffice
对象消费者"开始"功能现在开始处理
邮件SubOffice
对象然后对消费者进行自己的扇出
从Runnable
开始MailTruck.deliverMail
我可以设想一些解决方案:
shutdown
执行者并等待所有人
那些Runnable
要完成的,但这并不理想,因为你
必须从头开始为执行者重新创建那些线程
重复循环。 CompletableFuture
来解决这个问题。然而,对于一个严重嵌套的生产者 - 消费者模式,人们可能需要实施"回调地狱"把你所有的未来想象到最初的制作人。 Phaser
(即CountDownLatch
开启
使用移相器注册所有消费者,并且
完成时取消注册,同时使主线程等到
它已经完成了。我会想象等待完成然后循环,就像在上面的例子中一样,重复循环是一个常见的问题。 这类问题的标准解决方案或架构是什么?
答案 0 :(得分:1)
如果您想依赖Java8的CompletableFuture
,您可以使用CompletableFuture.thenCompose()
将嵌套的期货拼凑成一个。 (这相当于更多功能导向语言中通常称为flatmap的内容)。
为了将期货列表合并到一个单一的未来,您可以使用CompletableFuture.allOf()
,它将返回在所有单个期货完成时完成的未来。
将这两种方法结合起来,可以通过从所有子任务中构建各种未来的未来来避免回调地狱。