【问题标题】:Why OS struck on creating infinite java threads为什么一直坚持创建无限 Java 线程
【发布时间】:2017-07-06 14:16:57
【问题描述】:

我只是好奇并编写了以下代码。 在运行代码时,控制台显示创建的线程。我注意到创建了大约 32k 个线程。 我的问题是, 为什么我的 Windows 10 操作系统挂起,也无法通过任务管理器强制停止。 既然我的机器有 i7 处理器,为什么操作系统不能在其他进程上运行? 我相信由 java 程序创建的线程必须在其中一个进程中。

我是java初学者。 请让我知道在上述情况下内部发生了什么?


package infiniteThreads;

public class Main {

    public static void main(String[] args) {
        while(true){
            Thread t = new Thread(new Work());
            t.start();
        }

    }

}

package infiniteThreads;

public class Work implements Runnable{

    @Override
    public void run() {
        while(true){
            System.out.println("inside " + Thread.currentThread().getName());
        }

    }

}

【问题讨论】:

  • 您有一个 while (true) 循环,它不断创建和启动工作线程...这不是真正的 java 问题,而是编码语法问题,因为这可能出现在任何语言中。
  • “为什么操作系统无法在其他进程上运行?” 如果您的代码没有在所有内核上消耗 100%,那是因为 System.out.println()synchronized ,因此一次只有一个线程可以打印任何内容。这就像 32000 人试图穿过一扇门。他们都在排队等候,或者更确切地说,都围在门口,迫不及待地想要通过。
  • 如果它试图变得聪明并且对使用的线程设置限制,我将永远不会再使用 java。这是一个非常好的情况,java 做什么,创建线程并让操作系统决定如何处理它们

标签: java multithreading process


【解决方案1】:

就 java 而言,它会消耗系统上所有可用的处理器和所有 CPU 线程。但是您在这里的实验遇到的限制是操作系统级别的限制,大约是 Handles 可以阅读更多关于它的信息here

也许您可以尝试调整系统设置以尝试通过实验获得更多见解,可以试试这个link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 2012-05-06
    • 2020-06-07
    • 1970-01-01
    • 2021-05-14
    • 2011-12-07
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多