11

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

while( true ) {
  // do some stuff
  Thread.sleep( 1000 );
}

我注意到它使用了大量的 CPU - 高达 100%。几个月来,我的生产服务器上有一个类似的守护进程,同样存在同样的 CPU 问题。

昨天我重构了代码以使用TimerTask。我立即注意到我的开发盒上的 CPU 使用率下降了。所以我决定部署到生产环境并使用 Munin 进行仔细检查。以下是图表:

平均负载

CPU使用率

几点:

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

那么:为什么 Thread.sleep 与 TimerTask 相比效率如此之低?

4

2 回答 2

11

我能想到的三种可能:

  • 您有大量线程在执行此操作,并且它们一直在进行上下文切换。使用计时器将意味着只有一个线程。另一方面,这意味着您一次只能执行一个任务。
  • 在睡眠之前,您的循环中某处有一条continue;语句,因此即使循环的主要工作执行得不是很频繁,也有一些事情是。不过,如果没有看到更具体的代码,很难说。
  • 你有一个损坏的 JVM/OS 组合。诚然,这似乎不太可能。

一个重复执行的简单循环应该非常便宜——而且你也应该很容易验证Thread.sleep(1000)

于 2012-01-08T08:45:26.053 回答
0

比较处理器、线程和 timertask 的速度。timertask 是一个较慢的线程(慢得多)。

于 2017-05-18T17:31:07.937 回答