以下是我正在阅读的教科书的引用:
“也就是说,每当线程需要时 执行一个循环很多 迭代,这是一个很好的做法 每次迭代都有一个sleep() - 事件短暂的睡眠时间,例如5毫秒,可以减少整体 应用程序的CPU使用率 100%到> 1%“
我相信这是一个很好的做法,但是;不是调度程序就是这样 - 有点时间来 thread1 ;暂停 thread1 ;有点时间去thread2 ......等等。我无法掌握这样的掉落率,有谁愿意开导我?
答案 0 :(得分:5)
在更新某些内容的程序中,您会看到很多这样的内容。它被称为忙碌等待,这很糟糕。
如果你有一个类似这样的循环
public void run() {
while(running) {
gui.render();
}
}
当你真的不需要时,你会咀嚼你的CPU。你需要一遍又一遍地渲染它,每秒100000次以上吗?不,你真的每秒只需要30帧左右。
public void run() {
while(running) {
gui.render();
try { Thread.sleep(10); } catch(InterruptedException e) { /* we tried */}
}
}
这会将你限制在每秒不到100帧,你最终会有更好的表现。
对于处理器密集型后台线程,您并不总是希望这样,因为您希望它们具有优先级。话虽这么说,如果你的背景占用了所有的CPU,你将如何处理进一步的输入(比如,我不知道,一个取消按钮,因为你不是故意开始这种密集的,长达数小时的计算?)
因此,为您的线程添加一个小睡眠可能是一个非常好的决定。
答案 1 :(得分:2)
调度程序就是这样做的 不同之处在于调度程序正确执行。这意味着它将有效地使用CPU,这就是为什么你会获得良好的CPU使用率。
我没有看到任何不好的事情。这只是意味着它正在发挥作用。
当你让它睡眠时会有更多的空闲时间,你将减少CPU使用率。如果那是你出于某种原因的目标。
高CPU使用率是无害的(除非您遇到过热,否则会出现硬件问题)。
通常,当我处理多线程问题时,我实际上的目标是高CPU使用率。这通常意味着问题在线程之间平均分配,并且我从CPU获得最大值。
如果你使用1%的CPU意味着它不能正常工作,为什么要有这么好的电脑呢?你应该利用硬件。
答案 2 :(得分:2)
当你的程序执行数字运算(或其他cpu密集型任务)时,你希望它以100%运行,不是吗?
OTOH,如果你的程序正在等待输入,那么你应该尽可能地使用异步编程,而不是在循环中无休止地运行(异步=系统调用你)。
答案 3 :(得分:0)
算了。什么限制CPU使用率为1%买你? 什么都没有?
将CPU使用率限制为100倍意味着通常会减慢应用程序的速度。
如果有其他更重要的主题,或者您可能希望使用Thread.interrupt()
停止此主题,您可能需要它,但两者都可以实现。
答案 4 :(得分:0)
我从未听说过这种做法,但可能会导致巨大的 CPU使用量下降。这是因为调度程序为每个线程提供的“比特”时间非常小,因此与此相比,5ms是相当长的时间。
话虽如此,我看到一个地方可以从你的线程放慢这样做中受益:单核机器的响应能力。