我面临的问题是我有一个线程A和n工作需要完成。线程A必须等到这个n工作完全完成。我的想法是使用带有n计数的CountDownLatch
并使用Producer / Consumer模式来控制Worker。
我使用AtomicInteger
,作为计数器:生产者检查该计数器值大于0,那么把一个信号发送到BlockingQueue
,如果计数器的值小于或等于0 ,Producer将stopSignal放入队列。消费者从队列中取出,检查该信号是否不等于stopSignal然后使用ExecutorService
来调度Worker
。
工人调用getAndDecrement
并检查计数器的值是否大于0,如果是,则执行工作,
如果工作完成,则调用CountDownLatch#countdown else,用incrementAndGet
增加计数器
问题是,当一个工作尚未完成,工人必须增加计数器,但这是后getAndDecrement
这样的制片人可能会看到计数器的值是0,把停止信号,甚至总工作不到n!
答案 0 :(得分:1)
听起来你正在研究一个典型的生产者/消费者问题,并增加了一些复杂性(等待完成n个工作的新条件)。因此,正如您所定义的那样,您拥有生产者和消费者。一个人开始工作,第二个人开始工作。
创建工作后增加。在工作消耗后减少。只有在有可用的工作时,这种方法才会让您的工作人员尝试从队列中获取。
现在要解决您的问题,等待n的新条件可以完成。如果您正在等待一定数量的工作完成并且您清楚地意识到这些工作,您可以使用CyclicBarrier对象来阻止流程,直到所有工作都到达障碍。
在并发情况下,两个协调工作者通常有更多的方式。生产者/消费者可能不是解决这个问题的方法,也不是障碍者。我建议查看java.util.concurrent包,因为它可能会对这个主题有所了解。