为什么从无限循环切换到TimerTask会导致CPU使用率下降?

Rob*_*son 10 java cpu multithreading timertask

我写了一个守护进程,结构如下:

while( true ) {
  // do some stuff
  Thread.sleep( 1000 );
}
Run Code Online (Sandbox Code Playgroud)

我注意到它使用了非常大量的CPU - 高达100%.我的生产服务器上有一个类似的守护进程已经有几个月存在相同的CPU问题了.

昨天我重构了使用TimerTask的代码.我立即注意到我的开发盒上的CPU使用率有所下降.所以我决定使用Munin部署到生产和双重检查.以下是图表:

负载平均值

CPU使用率

几点:

  • 除了JVM之外,生产服务器上绝对没有其他任何东西在运行.
  • 没有其他应用程序线程在运行
  • 它肯定是以正确的周期性间隔执行旧式代码 - 每次线程执行时我总是写入日志.

那么:与TimerTask相比,为什么Thread.sleep效率低下?

Jon*_*eet 11

我能想到的三种可能性:

  • 你有大量的线程在做这件事,而且他们一直在进行上下文切换.使用计时器意味着只有一个线程.另一方面,这意味着您一次只能执行一个任务.
  • 你有continue;在睡眠之前,你的循环语句的地方,所以即使循环的工作主体不执行很频繁,一些是.如果没有看到更具体的代码,很难说.
  • 您有一个破碎的JVM/OS组合.诚然,这似乎不太可能.

一个简单的循环只是Thread.sleep(1000)反复执行应该非常便宜 - 这也应该很容易验证.