gpt4 book ai didi

java - 等待恰好 n 个工作完成 : Producer, 消费者和计数器

转载 作者:行者123 更新时间:2023-12-01 15:57:46 25 4
gpt4 key购买 nike

我面临的问题是我有一个线程 A 并且需要完成 n 个工作。线程A必须等待,直到这n个工作完全完成。我的想法是使用 CountDownLatch n 个计数并使用生产者/消费者模式来控制 Worker。

我使用AtomicInteger充当计数器:生产者检查计数器值是否大于 0,然后将信号发送到 BlockingQueue ,如果计数器值小于或等于0,Producer将一个stopSignal放入队列。 Consumer从队列中获取信号,检查信号是否不等于stopSignal,然后使用 ExecutorService安排 Worker

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

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

最佳答案

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

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

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

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

关于java - 等待恰好 n 个工作完成 : Producer, 消费者和计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com