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

前端之家收集整理的这篇文章主要介绍了java – 为什么从无限循环切换到TimerTask会导致CPU使用率下降?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个守护进程,结构如下:
while( true ) {
  // do some stuff
  Thread.sleep( 1000 );
}

我注意到使用了非常大的cpu – 高达100%.我的生产服务器上有一个类似的守护进程几个月,同样的cpu问题.

昨天我重写了代码使用TimerTask.我立刻注意到我的开发箱cpu使用率已经减少了.所以我决定部署到生产并使用Munin进行双重检查.以下是图表:

几点:

除了JVM,生产服务器上绝对没有其他的运行.
>没有其他应用程序线程运行
>它绝对是以正确的周期性间隔执行旧式代码 – 每当线程执行时,我总是写入日志.

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

解决方法

我可以想到的三种可能性:

>你有很多线程做这个,他们是上下文切换所有的时间.使用计时器将意味着只有一个线程.另一方面,这意味着你一次只能执行一个任务.
>你有一个继续;在休眠之前你的循环中的某个地方的声明,所以即使循环的主体工作不是很频繁地执行,事情就是这样.很难说没有看到一些更具体的代码.
>您有一个破坏的JVM / OS组合.这似乎不太可能,诚然.

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

原文链接:https://www.f2er.com/java/123938.html

猜你在找的Java相关文章