线程优先级和线程准确性

时间:2011-09-14 08:46:01

标签: java multithreading

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

正如我们所知,当您将睡眠调用50毫秒时,线程不准确,但是它是否会提高准确度?如果线程列为MAX_PRIORITY

感谢任何解释。

4 个答案:

答案 0 :(得分:5)

睡眠的准确性取决于操作系统。如果您想要更高的准确度,可以使用其他操作系统另一种方法是不要睡觉,你可以忙着等。或者你可以睡45秒,然后忙等5毫秒。

如果你有一项需要每秒运行20次的任务,你最好跟踪下一次运行任务的时间并在当时运行它(而不是等待一段固定的时间)。睡觉之间也需要一些时间。

BTW这是ScheduledExecutorService.scheduleAtFixedRate为你做的事。

它可以在具有微秒精度的任务之间休眠(假设操作系统支持它),但它不会漂移。

答案 1 :(得分:0)

我无法想象会出现这种情况。但线程优先级的影响取决于主机操作系统。

答案 2 :(得分:0)

它与线程精度没有直接关系,但是因为你在50毫秒的休眠之后给出了MAX优先级,JVM将选择任何以相同MAX优先级处理的线程。

答案 3 :(得分:0)

是的,可以使其更准确。

然而,来自Java Concurrency In Practice,Brian goetz:

  

线程优先级机制是一种钝器,并不总是明显改变优先级会产生什么影响;提升线程的优先级可能什么都不做,或者可能总是导致一个线程优先于另一个线程进行调度,导致饥饿。

     

通常明智的做法是抵制调整线程优先级的诱惑。一旦开始修改优先级,应用程序的行为就会变得特定于平台,并且会引入饥饿风险。您可以经常发现一个程序试图通过奇数位置Thread.sleepThread.yield调用的优先级调整或其他响应问题来恢复,以便为更低优先级的线程提供更多时间

因此,如果确实需要您的Thread.sleep(50)准确无误,请避免更改主题优先级并重新考虑您的设计!