我将使用ConcurrentLinkedQueue和Java作为一个更普遍的问题的例子。首先让我解释一下有关ConcurrentLinkedQueue的问题。考虑:
ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();
while (true) {
Integer item = queue.poll();
if (item != null) {
// do some stuff
}
}ConcurrentLinkedQueue::poll不阻塞。因此,如果我要在自己的线程中运行这段代码(只有这段代码)。它会经常做一个多余的操作。将其与使用像LinkedBlockingQueue::take这样的东西进行比较,直到某些东西可用时才会阻塞。这有多大的不同?
我意识到这个问题非常模糊,并且具体涉及到语言和数据结构的实现。但这些问题概括为这样的问题:
,运行一个执行一些小的、重复的操作(如
queue.poll())的永久循环是如何消耗资源的?
因为操作很小,但是重复,所以每次迭代完成得更快,但是循环也以更高的频率运行,这让我觉得更糟。
发布于 2021-03-05 22:11:35
由于您有无限多的操作要执行,由while (true)循环安排,您将使一个poll核心与polling实现保持100%的利用率。这不是个好主意。
另一方面,take阻塞线程,直到一个项可用为止。线程可以放在后台,而其他线程可以在CPU上执行。阻塞的线程不消耗资源。当一个项目可用时,只有在CPU上执行计划之后,它才会被唤醒。
后台线程调度的上下文切换可能会给您带来稍微慢一点的反应时间(这取决于线程调度和处理中断的操作系统实现),但总的来说,它应该比在CPU上不断地100%使用要好得多。
https://stackoverflow.com/questions/66500191
复制相似问题