Java线程 - cpu用法

nul*_*ent 5 java multithreading sleep class

以下是我正在阅读的教科书的引用:

"也就是说,每当一个线程需要执行一个包含大量迭代的循环时,最好在每次迭代中放置一个sleep() - 事件短暂的休眠时间,例如5毫秒,可以减少整个CPU的使用率.申请率从100%到> 1%"

我相信这是一个很好的做法,但是; 不是调度程序就是这样 - 对thread1有点时间; 暂停thread1 ; 有点时间去thread2 ......等等.我无法掌握这样的掉落率,有谁愿意开导我?

cor*_*iKa 5

在更新某些内容的程序中,您会看到很多这样的内容.它被称为忙碌等待,这很糟糕.

如果你有一个类似这样的循环

public void run() {
    while(running) {
        gui.render();
    }
}
Run Code Online (Sandbox Code Playgroud)

当你真的不需要时,你会咀嚼你的CPU.你需要一遍又一遍地渲染它,每秒100000次以上吗?不,你真的只需要每秒约30帧.

public void run() {
    while(running) {
        gui.render();
        try { Thread.sleep(10); } catch(InterruptedException e) { /* we tried */}
    }
}
Run Code Online (Sandbox Code Playgroud)

这将限制你每秒不到100帧,你最终会有更好的性能.

对于处理器密集型后台线程,您并不总是希望这样,因为您希望它们具有优先级.话虽这么说,如果你的背景占用了所有的CPU,你将如何处理进一步的输入(比如,我不知道,一个取消按钮,因为你不是故意开始这种密集的,长达数小时的计算?)

因此,为您的线程添加一个小睡眠可能是一个非常好的决定.