以下是我正在阅读的教科书中的一句引言:
"也就是说,每当一个线程需要执行大量迭代的循环时,在每个迭代中放置一个sleep()是一个好习惯 - 即使是短暂的睡眠时间,例如5毫秒,也可以将应用程序的CPU使用率从100%降低到> 1%"
我认为这是一个好习惯,但是,调度程序难道不正是这样做的吗 - 给thread1一点时间; 暂停thread1; 给thread2一点时间...等。我无法理解这种降低率,请有意者给我启示。
以下是我正在阅读的教科书中的一句引言:
"也就是说,每当一个线程需要执行大量迭代的循环时,在每个迭代中放置一个sleep()是一个好习惯 - 即使是短暂的睡眠时间,例如5毫秒,也可以将应用程序的CPU使用率从100%降低到> 1%"
我认为这是一个好习惯,但是,调度程序难道不正是这样做的吗 - 给thread1一点时间; 暂停thread1; 给thread2一点时间...等。我无法理解这种降低率,请有意者给我启示。
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,那么您将如何处理进一步的输入(比如,我不知道,一个“取消”按钮,因为您没有意识到开始了那个耗时数小时的计算?)
因此,在您的线程中添加一个小的休眠时间可能是一个非常好的决定。
当你的程序进行数字计算(或其他cpu密集型任务)时,你希望它以100%的速度运行,对吧?
另一方面,如果你的程序正在等待输入,则应尽可能使用异步编程,而不是无限循环运行(异步=系统调用你)。
算了吧。将CPU使用率限制在1%有什么好处?完全没有?
通常情况下,将CPU使用率降低100倍意味着将应用程序的速度降低相同的倍数。
你可能希望这样做是因为有其他更重要的线程,或者你可能想使用Thread.interrupt()
停止此线程,但两者都可以通过其他方式实现。
我从未听说过这样的做法,但它可能会导致CPU使用率大幅下降。这是因为调度程序为每个线程分配的时间“片段”非常小,因此与此相比,5毫秒是相当长的时间。
话虽如此,我看到你可以从这样减缓线程的地方受益:单核机器的响应能力。