1

有一个多生产者消费者模式生产者1->消费者1/生产者2->消费者2/生产者3,每个生产者都使用一个完成服务,但是我在编写完成后的逻辑编码时遇到了问题。

问题是 main 将一些 (x) 任务放在生产者 1 队列中,这反过来会导致生产者 1 将 (y) 任务放在生产者 2 上,并且生产者 2 会将 z 任务放在生产者 3 上。x、y 和 z 是不同,因此 main 不能只查看生产者 3 完成队列并获取 z 期货,因为 main 不知道 z。

所以我尝试了毒丸的想法和一个初始化为3的CountDownLatch,主要知道生产者1只有x个任务,所以我可以在最后提交毒丸,然后当生产者1收到这个它可以减少锁存器并发送毒药药丸发送给生产者 2,生产者 2 接收到一个它会减少锁存器,然后将其发送给生产者 3。当生产者 3 收到它时,它会减少锁存器。main 只是做 countdownlatch.await() 并且在所有任务完成之前无法继续。但这只有在每个 executor 服务仅限于一个线程时才有效,因为当生产者收到毒丸时,它仅意味着所有前面的任务都已启动尚未完成。

那么我该如何解决这个问题,我想我一定是在某个地方错过了一个更简单的解决方案。

4

1 回答 1

0

您可以依次关闭和等待每个 executorService 的终止。

ExecutorService[] services = { executor1, executor2, executor3 };
for(ExecutorService service: services) {
    service.shutdown();
    service.awaitTermination(1, TimeUnit.MINUTES);
}
于 2011-11-14T17:27:13.453 回答