线程优先级和线程准确性

7

线程优先级是否会提高Thread.sleep(50);的准确性呢?

我们知道,当您调用sleep 50ms时,线程并不准确,但是它是否会以任何方式提高准确性呢?如果线程被列为MAX_PRIORITY

非常感谢任何形式的解释。

4个回答

5
睡眠的准确性取决于操作系统。如果您想要更高的准确性,可以使用其他操作系统。另一种方法是不要睡眠,可以使用忙等待。或者您可以睡眠45毫秒,然后忙等待5毫秒。
如果您有一个需要每秒运行20次的任务,最好跟踪任务应该下一次运行的时间,并在该时间运行它(而不是等待固定时间),因为在睡眠之间所做的事情也需要一些时间。
顺便说一下,这就是ScheduledExecutorService.scheduleAtFixedRate为您完成的工作。
它可以在任务之间以微秒精度进行睡眠(假设操作系统支持),但它会尽量避免漂移。

0

我无法想象这会是真的。但是线程优先级的影响取决于主机操作系统。


0

这与线程精确度没有直接关系,但是当您在休眠50毫秒后给予了最高优先级(MAX priority),JVM将选择任何一个具有相同最高优先级的线程来处理。


0

是的,这样做可能会使它更准确。

然而,来自Brian Goetz的《Java并发实践》

线程优先级机制是一种粗糙的工具,改变优先级的影响并不总是明显的;提高线程的优先级可能没有任何作用,或者可能总是导致一个线程被优先调度,从而导致饥饿。

通常最好抵制调整线程优先级的诱惑。一旦开始修改优先级,您的应用程序的行为就变得特定于平台,并引入了饥饿的风险。您经常可以通过在奇怪的地方出现Thread.sleepThread.yield调用来发现试图从优先级调整或其他响应性问题中恢复的程序,以尝试给低优先级线程更多时间。

因此,避免改变线程优先级,如果您真的需要您的Thread.sleep(50)如此准确,请重新考虑您的设计!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接