gpt4 book ai didi

java - 如何以线程安全的方式访问ThreadpoolExecutor的底层队列

转载 作者:行者123 更新时间:2023-12-02 08:18:19 33 4
gpt4 key购买 nike

getQueue()方法提供了对ThreadPoolExecutor中底层阻塞队列的访问,但这似乎并不安全。

遍历此函数返回的队列可能会错过 ThreadPoolExecutor 对队列进行的更新。

“方法 getQueue() 允许访问工作队列以进行监视和调试。强烈建议不要将此方法用于任何其他目的。”

如果你想遍历ThreadPoolExecutor使用的workQueue你会怎么做?或者有其他方法吗?

这是……的延续。 Choosing a data structure for a variant of producer consumer problem

现在,我正在尝试多个生产者多个消费者,但我想使用一些现有的线程池,因为我不想自己管理线程池,而且我还想在 ThreadPoolExecutor 完成执行某些任务时进行回调能够以线程安全的方式检查“正在进行的事务”数据结构。

最佳答案

您可以重写 beforeExecute 和 afterExecute 方法,让您知道任务已开始和完成。您可以重写exe​​cute()来了解任务何时添加。

您遇到的问题是队列并非设计用于查询,并且任务可能会在您看到它之前就被消耗掉。解决这个问题的一种方法是创建您自己的队列实现(可能覆盖/包装 ConcurrentLinkedQueue)

顺便说一句:队列是线程安全的,但不能保证您会看到每个条目。

ConcurrentLinkedQueue.iterator() 被记录为

Returns an iterator over the elements in this queue in proper sequence. The returned iterator is a "weakly consistent" iterator that will never throw ConcurrentModificationException, and guarantees to traverse elements as they existed upon construction of the iterator, and may (but is not guaranteed to) reflect any modifications subsequent to construction.

关于java - 如何以线程安全的方式访问ThreadpoolExecutor的底层队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5935454/

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