我写了一个结构如下的守护进程:
while( true ) {
// do some stuff
Thread.sleep( 1000 );
}
我注意到它使用了大量的 CPU - 高达 100%。几个月来,我的生产服务器上有一个类似的守护进程,同样存在同样的 CPU 问题。
昨天我重构了代码以使用TimerTask。我立即注意到我的开发盒上的 CPU 使用率下降了。所以我决定部署到生产环境并使用 Munin 进行仔细检查。以下是图表:
几点:
- 除了 JVM,生产服务器上绝对没有其他任何东西在运行。
- 没有其他应用程序线程在运行
- 它肯定是以正确的周期性间隔执行旧式代码 - 每次线程执行时我总是写入日志。
那么:为什么 Thread.sleep 与 TimerTask 相比效率如此之低?