我编写了一个结构如下的守护进程:
while( true ) {
// do some stuff
Thread.sleep( 1000 );
}
我注意到它使用了非常大量的CPU - 高达100%。在我的生产服务器上,我有一个类似的守护进程已经存在好几个月,也有相同的CPU问题。
昨天我重构了代码,使用TimerTask。立即我发现CPU使用率在我的开发环境中已经降低。因此,我决定部署到生产环境并使用Munin进行双重检查。以下是图表:
几点说明:
- 除JVM外,生产服务器上绝对没有其他内容在运行。
- 没有其他应用程序线程在运行
- 它肯定以正确的周期间隔执行旧式代码 - 我每次线程执行时都写入日志。
所以:为什么Thread.sleep与TimerTask相比如此低效?
wait()
。请查看mainLoop
中的queue.wait(executionTime - currentTime)
。 - Matt