我面临的问题是我有一个线程 A 并且需要完成 n 个工作。线程 A 必须等到这 n 个工作完全完成。我的想法是使用CountDownLatch
n 计数并使用 Producer/Consumer 模式来控制 Worker。
我使用 anAtomicInteger
作为计数器:生产者检查计数器值是否大于 0,然后将信号发送到BlockingQueue
,如果计数器值小于或等于 0,则生产者将 stopSignal 放入队列。Consumer 从队列中取出,检查信号是否不等于 stopSignal,然后使用 aExecutorService
来调度Worker
.
Worker 调用getAndDecrement
并检查计数器的值是否大于 0,如果是则执行工作,如果工作完成则调用 CountDownLatch#countdown 否则增加计数器incrementAndGet
问题是当工作没有完成时,工人必须增加计数器,但这是在 a 之后,getAndDecrement
所以生产者可能会看到计数器的值为 0,并发出停止信号,即使工作总和小于 n!