繁体   English   中英

Java线程 - cpu用法

[英]Java threads - cpu usage

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

“也就是说,每当一个线程需要执行一个包含大量迭代的循环时,最好在每次迭代中放入一个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,这就是为什么你会获得良好的CPU使用率。

我没有看到任何不好的事情。 它只是意味着它的工作。

当你让它睡觉时会有更多的空闲时间,你将减少CPU的使用。 如果那是你出于某种原因的目标。
高CPU使用率是无害的(除非您遇到过热,否则会出现硬件问题)。

通常当我处理多线程问题时,我实际上的目标是高CPU使用率。 这通常意味着问题在线程之间平均分配,并且我从CPU获得最大值。

如果你使用1%的CPU意味着它不能工作,为什么要有这么好的电脑呢? 你应该利用硬件。

当你的程序执行数字运算(或其他cpu密集型任务)时,你希望它以100%运行,不是吗?

OTOH,如果你的程序正在等待输入,那么你应该尽可能多地使用异步编程,而不是在循环中无休止地运行(异步=系统调用你)。

算了吧。 什么限制CPU使用率为1%买你? 什么都没有?

将CPU使用率限制为100倍意味着通常会减慢应用程序的速度。

如果有其他更重要的线程,或者你可能想要使用Thread.interrupt()来阻止这个线程,你可能需要它,但两者都可以实现。

我从未听说过这种做法,但它可能会导致CPU使用率大幅下降。 这是因为调度程序为每个线程提供的“时间”位非常小,因此与此相比,5ms是相当长的时间。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM