gpt4 book ai didi

java - 多生产者单消费者队列,无专用消费者线程

转载 作者:行者123 更新时间:2023-11-30 08:07:14 27 4
gpt4 key购买 nike

我正在编写一个异步应用程序,它将元素提交到工作队列进行处理。要求是:

  • 队列中没有后台线程正在监听。向队列提交元素的任何线程都可能负责消耗队列。
  • 可以有多个并发生产者,但只有一个线程可以作为 Activity 消费者。
  • 如果线程 A 提交了一个元素,但线程 B 正在主动消耗队列,则线程 A 应立即返回。无需等待。

这是我正在尝试做的事情的示例:

final Queue<T> queue = new ConcurrentLinkedQueue<>();
final AtomicBoolean processing = new AtomicBoolean();

void offer(T t) {
queue.offer(t);

for (;;) {
if (processing.compareAndSet(false, true)) {
try {
for (;;) {
T t = queue.poll();
if (t == null) {
break;
}
// process t
}
} finally {
processing.set(false);
}

// see if another thread submitted an element but didn't process it
// if not, we can break
if (queue.isEmpty()) {
break;
}
} else {
// losers should exit
break;
}
}
}

认为我的代码可以工作,但是这个问题听起来相当标准,所以我想知道是否有任何教科书解决方案或至少有一个通用名称。到目前为止,我只找到需要工作线程监听队列的算法。

最佳答案

您的代码是正确的,但问题并不被视为标准:通常,拥有后台线程并不那么昂贵,例如:

  1. 生产者没有有限的时间保证。某些生产者有可能长时间工作在消费者模式下。

  2. 生产者代码变得复杂

无论如何,您的问题标题(没有专用消费者线程的 MPSC)很好地描述了问题。要解决此问题,您可以将 trylock/unlock 方法与任何 MPSC 实现结合起来,无需通知机制。 MPSC 的唯一额外要求是并发 queue.isEmpty() 方法,但通常这不是问题。

关于java - 多生产者单消费者队列,无专用消费者线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926129/

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