java - 无限循环的线程会导致CPU占用率过高吗

标签 java multithreading concurrency

所以这可能最终会成为一个尴尬的问题,但是对于 Java,线程中的无限循环会导致 CPU 使用率过高吗?我对 Java 中的多线程不是很了解,但我的假设是 Java 为所有线程分配相同的时间,无论线程是否有事情要做。因此,我隐含地假设多线程环境中的无限循环不会像单线程环境中那样对性能造成负担。因此,我有很多代码,如下所示:

public Thread readerThread = new Thread() {
  @Override
  public void run() {
    while(true) {
      readNextMessage(); // Does nothing if there are no messages to read
    }
  }
}
readerThread.start();

我最近开始注意到我的应用程序中存在严重的性能问题,并且我开始怀疑我的线程方法是否是原因。

最佳答案

不可能将时间分配给无事可做的线程。仅当线程准备好运行时才能对其进行调度。因等待某事发生而被阻塞的线程尚未准备好运行。

想象一下,如果您的假设是正确的,并且服务器有 100 个线程,每个客户端一个线程。现在,进一步想象一下,大多数客户都是不活跃的。这意味着每个 Activity 客户端最多只能获得 1/100 的 CPU。那将是非常糟糕的。

无事可做时消耗 CPU 的线程会阻止 CPU 进入休眠状态、浪费电量并降低性能,不仅会降低同一进程中的其他线程的性能,还会降低整个系统的性能。

关于java - 无限循环的线程会导致CPU占用率过高吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62432121/

相关文章:

java - Selenium chromedriver 2.27.440174 无法运行 Google Chrome 55.0.2883.87 m

java - 基于 EJB JPA 的应用程序在 1 小时 10 分钟后抛出 NPE

java - 操作 JSON 文件并在操作完成后将其解析为对象 - 在内存中

java - 无法将 JOptionPane 设置为不可见然后再次恢复可见

java - LongAccumulator 没有得到正确的结果

java - Install4j - 如何获取安装程序的版本?

c# - 如何在不阻塞 UI 的情况下等待线程完成

java - 如何创建一个使用线程从下限到上限计数的程序?

c++ - 让线程池的所有线程执行给定的函数

go - 在go中定期运行一个函数