Thread.sleep()的Java性能问题

Thread.sleep()的Java性能问题,java,multithreading,Java,Multithreading,内联Java IDE提示指出,“在循环中调用Thread.sleep可能会导致性能问题。”我在文档的其他地方找不到任何说明。这项声明 为什么??怎么用?还有什么其他方法可以延迟线程的执行?这取决于等待是否依赖于另一个线程完成工作,在这种情况下,您应该使用,或者是Java 1.6中引入的。我最近不得不修复一些CircularByteBuffer代码,这些代码使用线程休眠而不是保护块。对于前面的方法,无法确保适当的并发性。如果您只是想让线程像游戏一样休眠,那么在核心游戏循环中暂停执行一段时间,这样过

内联Java IDE提示指出,“在循环中调用Thread.sleep可能会导致性能问题。”我在文档的其他地方找不到任何说明。这项声明


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

这取决于等待是否依赖于另一个线程完成工作,在这种情况下,您应该使用,或者是Java 1.6中引入的。我最近不得不修复一些
CircularByteBuffer
代码,这些代码使用线程休眠而不是保护块。对于前面的方法,无法确保适当的并发性。如果您只是想让线程像游戏一样休眠,那么在核心游戏循环中暂停执行一段时间,这样过多的线程就有了良好的执行时间,
thread.sleep(…)
非常好。

循环中的
thread.sleep
本身并不是性能问题,但这通常是一个暗示,你在做错事

while(! goodToGoOnNow()) {
   Thread.sleep(1000);
}
仅当您想将线程挂起一段时间时,才使用
Thread.sleep
。如果要等待特定条件,请不要使用它

对于这种情况,您应该使用
wait/notify
,或者使用并发utils包中的一些构造


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

这取决于您将其置于睡眠状态的原因和运行频率

我可以想出几种在不同情况下适用的替代方案:

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

我建议研究CountdownClatch类。网上有很多琐碎的例子。回到我刚开始多线程编程的时候,它们只是取代“边睡觉边循环”的票。

为什么?这是因为上下文切换(操作系统CPU调度的一部分)

怎么做?调用Thread.sleep(t)使当前线程从运行队列移动到等待队列。在时间“t”到达后,当前线程将从等待队列移动到准备队列,然后CPU需要一些时间来选择并运行


解决方案:调用Thread.sleep(t*10);我以前在等待异步进程返回结果时遇到过这个问题,而不是在10次迭代的循环中调用Thread.Sleep(t)…

在多线程场景中,Thread.sleep是一个问题。它容易睡过头。这是因为它在内部重新安排了优先级,并让位于其他长时间运行的进程(线程)

一种新的方法是使用Java5中引入的ScheduledExecutorService接口或ScheduledThreadPoolExecutor

参考资料:

1.6。我可以从Thread.sleep()中获得什么样的精度

短睡眠的基本问题是,对睡眠的调用完成了当前的调度时间片。只有在所有其他线程/进程完成后,调用才能返回

对于Sun JDK,据报道Thread.sleep(1)在Windows上非常精确。对于Linux,这取决于内核的计时器中断。如果内核是以HZ=1000(alpha上的默认值)编译的,则报告精度良好。对于HZ=100(x86上的默认值),它通常会休眠20毫秒


使用Thread.sleep(毫秒、纳米)并不能改善结果。在Sun JDK中,纳秒值刚好四舍五入到最接近的毫秒。(马蒂亚斯)

这可能不是问题,这要看情况而定

在我的例子中,我使用Thread.sleep()等待几秒钟,然后再尝试重新连接到外部进程。我对这个重新连接逻辑有一个while循环,直到它达到最大尝试次数。所以在我的例子中,Thread.sleep()纯粹是为了计时,而不是在多线程之间进行协调,这是非常好的


您可以在IDE中配置如何处理此警告

谢谢你的回复。线程通过TCP与外部设备通信,等待它开始运行:协议是,您正在运行吗?不,睡觉。。。。。你在跑步吗?不,睡觉。。。你在跑步吗?对继续。。。。所以没问题。谢谢!别忘了InterruptedException。也许你可以改变这个问题来澄清它实际上是来自某个IDE的警告……比如“哪个性能问题可能是‘调用…’”呢?”