0

我面临的问题是我有一个线程 A 并且需要完成 n 个工作。线程 A 必须等到这 n 个工作完全完成。我的想法是使用CountDownLatchn 计数并使用 Producer/Consumer 模式来控制 Worker。

我使用 anAtomicInteger作为计数器:生产者检查计数器值是否大于 0,然后将信号发送到BlockingQueue,如果计数器值小于或等于 0,则生产者将 stopSignal 放入队列。Consumer 从队列中取出,检查信号是否不等于 stopSignal,然后使用 aExecutorService来调度Worker.

Worker 调用getAndDecrement并检查计数器的值是否大于 0,如果是则执行工作,如果工作完成则调用 CountDownLatch#countdown 否则增加计数器incrementAndGet

问题是当工作没有完成时,工人必须增加计数器,但这是在 a 之后,getAndDecrement所以生产者可能会看到计数器的值为 0,并发出停止信号,即使工作总和小于 n!

4

1 回答 1

1

听起来您正在处理一个典型的生产者/消费者问题,并增加了一些复杂性(等待恰好 n 个工作完成的新条件)。因此,正如您所定义的,您有生产者和消费者。一个制造工作,第二个消耗它。

创建工作后递增。消耗完工作后递减。这种方法将使您的工作人员仅在有可用工作时才尝试从队列中获取。

现在来解决您的问题,您等待 n 工作完成的新条件。如果您正在等待一定数量的作业完成并且您清楚地知道这些作业,您可以使用CyclicBarrier对象来停止流程,直到所有作业都到达障碍。

在并发情况下,两个协调工作人员通常有更多的方法。生产者/消费者可能不是这个问题的解决方案,障碍也不是。我建议查看 java.util.concurrent 包,因为它可能会更清楚地说明这个主题。

于 2011-01-21T04:13:57.383 回答