我现在遇到了一个问题,生产者线程会产生N个工作项,将它们提交给ExecutorService,然后需要等待所有N个项目都被处理完才能继续执行。
注意事项:
- N的数量不是提前确定的,如果已知数量,我可以创建CountDownLatch并使生产者线程await直到所有任务完成。 - 使用CompletionService不合适,因为尽管我的生产线程需要阻塞(即调用take()),但没有办法表示所有工作都已完成,以便让生产线程停止等待。
我目前偏爱的解决方案是使用整数计数器。每当提交一个工作项时,就会将其增加,并在处理一个工作项时将其减小。所有N个任务提交后,我的生产者线程将需要在锁上等待,通知时检查counter == 0。如果消费线程将计数器减少并且新值为0,则需要通知生产者。
是否有更好的方法来解决这个问题,或者是否有java.util.concurrent中的适当结构可供使用,而不是“rolling my own”?
谢谢。
注意事项:
- N的数量不是提前确定的,如果已知数量,我可以创建CountDownLatch并使生产者线程await直到所有任务完成。 - 使用CompletionService不合适,因为尽管我的生产线程需要阻塞(即调用take()),但没有办法表示所有工作都已完成,以便让生产线程停止等待。
我目前偏爱的解决方案是使用整数计数器。每当提交一个工作项时,就会将其增加,并在处理一个工作项时将其减小。所有N个任务提交后,我的生产者线程将需要在锁上等待,通知时检查counter == 0。如果消费线程将计数器减少并且新值为0,则需要通知生产者。
是否有更好的方法来解决这个问题,或者是否有java.util.concurrent中的适当结构可供使用,而不是“rolling my own”?
谢谢。