我现在遇到了两次问题,生产者线程产生 N 个工作项,将它们提交给一个ExecutorService
,然后需要等到所有 N 个项目都被处理完。
注意事项
- N 事先不知道。如果是,我会简单地创建一个
CountDownLatch
然后拥有生产者线程await()
,直到所有工作完成。 - 使用 a
CompletionService
是不合适的,因为尽管我的生产者线程需要阻塞(即通过调用take()
),但无法发出所有工作已完成的信号,从而导致生产者线程停止等待。
我目前最喜欢的解决方案是使用整数计数器,并在提交工作项时增加它,并在处理工作项时减少它。在提交所有 N 个任务之后,我的生产者线程将需要等待一个锁,检查是否counter == 0
收到通知。消费者线程将需要通知生产者,如果它已经减少了计数器并且新值是 0。
有没有更好的方法来解决这个问题,或者java.util.concurrent
我应该使用合适的构造而不是“滚动我自己的”?
提前致谢。