gpt4 book ai didi

java - 如何使用当前线程来处理一个工作队列?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:22 26 4
gpt4 key购买 nike

我使用什么数据结构来实现以下逻辑?

  1. read() 是一种异步方法,可以对一些工作负载进行排队
  2. 一次只能运行一个工作负载。
  3. 第一个排队工作负载的线程成为工作线程。它在返回之前处理队列中的所有工作。下一个调用 read() 的线程成为新的工作线程,依此类推...
  4. 如果其他线程在工作线程处理队列时调用 read(),它们只会添加到队列末尾并立即返回。

我知道如何使用 ConcurrentLinkedQueue 和 AtomicBoolean 来实现它,但我觉得有更好的方法。

澄清:工作负载包括调用另一个名为 read2() 的异步方法。 read2() 是异步的但不是线程安全的。当我说工作线程“处理工作负载”时,它只是触发第一个读取操作并立即返回。当 read2() 完成时,它调用队列上的下一个操作,依此类推。整个 API 是异步的。因此,我想避免使用专用的消费者线程(没有真正需要它并且不利于可伸缩性)。

最佳答案

由于检测线程处理队列项的确切状态的不确定性,我建议每个线程,无论是用户线程还是触发异步回调的某个内核线程,到达该系统时都将其工作负载排入队列然后尝试处理队列中的所有项目。如果某些工作负载请求非线程安全调用的问题,请仅使用 CS/spinner 保护此调用 - 你说这些非线程安全调用无论如何都是简短的,因此 CS/自旋锁将花费你很少的钱。

转储 AtomicBoolean。虽然发现它很清楚确实意味着没有线程正在处理队列中的工作负载,但发现它已设置并不意味着线程正在处理队列中的项目:还有第三种状态——“完成了队列中的项目但还没有完全解决”清除 boolean 值'。

Rgds,马丁

关于java - 如何使用当前线程来处理一个工作队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6655518/

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