Java线程 - cpu用法

时间:2011-03-28 21:04:17

标签: java multithreading class sleep

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

  

“也就是说,每当线程需要时   执行一个循环很多   迭代,这是一个很好的做法   每次迭代都有一个sleep()    - 事件短暂的睡眠时间,例如5毫秒,可以减少整体   应用程序的CPU使用率   100%到> 1%“

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

5 个答案:

答案 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是相当长的时间。

话虽如此,我看到一个地方可以从你的线程放慢这样做中受益:单核机器的响应能力。