Thread.sleep()的Java性能问题

fcw*_*fcw 21 java multithreading

内联Java IDE提示声明,"在循环中调用Thread.sleep会导致性能问题." 我在文档的其他地方找不到解释.这个说法.

为什么?怎么样?还有什么其他方法可以延迟线程的执行?

Thi*_*ilo 34

Thread.sleep循环本身并不是性能问题,但通常暗示你做错了.

while(! goodToGoOnNow()) {
   Thread.sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

使用Thread.sleep仅如果要暂停您的线程一定的时间.如果您想等待某种情况,请不要使用它.

对于这种情况,您应该使用wait/notify并发工具包中的替代或一些构造.

Thread.sleep只有在等待当前JVM外部的条件时才应使用轮询(例如,等待另一个进程写入文件).


Chr*_*ett 6

这取决于等待是否依赖于完成工作的另一个线程,在这种情况下,您应该使用受保护的块,或Java 1.6中引入的高级并发类.我最近不得不修复一些CircularByteBuffer使用Thread睡眠而不是保护块的代码.使用前面的方法,无法确保正确的并发性.如果你只是希望线程像游戏那样睡觉,那么在核心游戏循环中暂停执行一段时间,以便线程有很好的执行周期,这Thread.sleep(..)是完全正常的.


Bra*_*ace 5

这取决于你为什么要睡觉以及你经常跑的频率.

我可以想到几种可能适用于不同情况的替代方案:

  • 让线程死掉并稍后开始一个新线程(创建线程也可能很昂贵)
  • 使用Thread.join()等待另一个线程死掉
  • 使用Thread.yield()允许另一个线程运行
  • 让线程运行但将其设置为较低的优先级
  • 使用wait()和notify()