首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentLinkedQueue和poll()

ConcurrentLinkedQueue和poll()
EN

Stack Overflow用户
提问于 2021-03-05 22:01:55
回答 1查看 287关注 0票数 0

我将使用ConcurrentLinkedQueue和Java作为一个更普遍的问题的例子。首先让我解释一下有关ConcurrentLinkedQueue的问题。考虑:

代码语言:javascript
复制
ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();
while (true) {
    Integer item = queue.poll();
    if (item != null) {
        // do some stuff
    }
}

ConcurrentLinkedQueue::poll不阻塞。因此,如果我要在自己的线程中运行这段代码(只有这段代码)。它会经常做一个多余的操作。将其与使用像LinkedBlockingQueue::take这样的东西进行比较,直到某些东西可用时才会阻塞。这有多大的不同?

我意识到这个问题非常模糊,并且具体涉及到语言和数据结构的实现。但这些问题概括为这样的问题:

,运行一个执行一些小的、重复的操作(如queue.poll())的永久循环是如何消耗资源的?

因为操作很小,但是重复,所以每次迭代完成得更快,但是循环也以更高的频率运行,这让我觉得更糟。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-05 22:11:35

由于您有无限多的操作要执行,由while (true)循环安排,您将使一个poll核心与polling实现保持100%的利用率。这不是个好主意。

另一方面,take阻塞线程,直到一个项可用为止。线程可以放在后台,而其他线程可以在CPU上执行。阻塞的线程不消耗资源。当一个项目可用时,只有在CPU上执行计划之后,它才会被唤醒。

后台线程调度的上下文切换可能会给您带来稍微慢一点的反应时间(这取决于线程调度和处理中断的操作系统实现),但总的来说,它应该比在CPU上不断地100%使用要好得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66500191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档