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

标签 java multithreading cpu timertask

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

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

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

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

Load average

CPU usage

几点:

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

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

最佳答案

我能想到的三种可能:

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

只是重复执行 Thread.sleep(1000) 的简单循环应该非常便宜 - 而且您也应该很容易验证。

关于java - 为什么从无限循环切换到 TimerTask 会导致 CPU 使用率下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776319/

相关文章:

java - 什么取代了 RxJava2 中的 Notification.Kind

java - 我应该让我所有的 java 代码线程安全吗?

c# - 从 TypeBuilder.CreateType 返回的类型的 Activator.CreateInstance 抛出 ArgumentException

c++ - boost::interprocess 中 win32 文件锁定的模拟是什么?

Linux:如何加载系统内存?

kubernetes - kubeadm init error CPU 1 is less than required 2

java - 卡门与 Spring 和 Akka

java - 如何在 Libgdx 中检测滑动而不触发 justTouched()?

android - IntentService 或 JobScheduler 在 onPause 期间执行 I/O 密集型数据保存操作

algorithm - 从理论上知道您需要多强大的微 Controller 来运行您的程序?