确定嵌套的消费者完成情况

时间:2017-11-06 17:20:29

标签: java concurrency parallel-processing

如何为大量嵌套的生产者 - 消费者同步整体消费者完成情况?

例如,让我们说你有一个" USPS"系统实施:

  1. 运行Backoffice.start函数,启动Runnable 我的SubOffice对象中的SubOffice.startMailProcessing
  2. 我的全部 SubOffice对象消费者"开始"功能现在开始处理 邮件
  3. 每个SubOffice对象然后对消费者进行自己的扇出 从Runnable开始MailTruck.deliverMail
  4. 等待以上所有邮件 处理当天邮件和所有卡车交付的流程 邮件
  5. 重复
  6. 我可以设想一些解决方案:

    1. 似乎有一种方法是shutdown执行者并等待所有人 那些Runnable要完成的,但这并不理想,因为你 必须从头开始为执行者重新创建那些线程 重复循环。
    2. Java 8提供了一个构造CompletableFuture来解决这个问题。然而,对于一个严重嵌套的生产者 - 消费者模式,人们可能需要实施"回调地狱"把你所有的未来想象到最初的制作人。
    3. 使用Phaser(即CountDownLatch开启 使用移相器注册所有消费者,并且 完成时取消注册,同时使主线程等到 它已经完成了。
    4. 一些基于反应宣言的技术,比如RxJava,似乎可以处理其中一些类型的案例。
    5. 我会想象等待完成然后循环,就像在上面的例子中一样,重复循环是一个常见的问题。 这类问题的标准解决方案或架构是什么?

1 个答案:

答案 0 :(得分:1)

如果您想依赖Java8的CompletableFuture,您可以使用CompletableFuture.thenCompose()将嵌套的期货拼凑成一个。 (这相当于更多功能导向语言中通常称为flatmap的内容)。

为了将期货列表合并到一个单一的未来,您可以使用CompletableFuture.allOf(),它将返回在所有单个期货完成时完成的未来。

将这两种方法结合起来,可以通过从所有子任务中构建各种未来的未来来避免回调地狱。