Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在无限循环中启动线程会发生什么_Java_Multithreading_Infinite Loop - Fatal编程技术网

Java 如果在无限循环中启动线程会发生什么

Java 如果在无限循环中启动线程会发生什么,java,multithreading,infinite-loop,Java,Multithreading,Infinite Loop,请检查下面的代码 public class InfiniteThreads { public static int cnt=0; public static void main(String[] args) { while (true) { new MyThread().start(); } } } class MyThread extends Thread{ @Override

请检查下面的代码

public class InfiniteThreads {
    public static int cnt=0;
    public static void main(String[] args) {
        while (true) {          
            new MyThread().start();
        }
    }

}

class MyThread extends Thread{
    @Override
    public void run() {
    sleep(100000);
    System.out.println(InfiniteThreads.cnt++);
    }
}

让我们忘记对机器性能的影响吧,我很好奇在这种情况下程序会抛出什么异常/错误?

线程中没有无限循环。您正在不停地创建线程,但它们只增加并打印一行。之后它们就会消失。

正如Murat所解释的,您正在创建短线程,如果您需要获得一个
StackOverflowException
,只需:

class MyThread extends Thread{
    @Override
    public void run() {
        this.run();
    }
}

官方的回答应该是:“行为是未定义的。”

Java语言规范(JLS)没有说明多少线程太多,也没有说明当程序达到极限时会发生什么

java.lang.Thread
的javadoc表明可能会抛出OutOfMemoryError

在某些平台上,为stackSize参数指定更高的值可能会允许[…]。类似地,指定较低的值可能会允许并发存在更多线程,而不会引发OutOfMemoryError(或其他内部错误)


我在尝试在IBM JVM中创建新线程时看到了OutOfMemoryError,但是如果在不同的JVM中尝试该实验,可能会得到不同的结果。

您的线程只运行了很短的一段时间,然后就终止了—不会有大量线程并行运行。而且,是的,旧对象要接受垃圾收集。在每个线程所做的工作中添加一个Thread.Sleep(1000000),您应该得到崩溃:)。例如,在run()方法中添加sleep。@AndreasFester是,因为run()中只有一条语句,但我基本上是在问这个问题,因为线程中的大块代码或执行时间越长,会引发什么异常/错误?启动的线程越多,创建主线程的速度就越慢,直到达到自然平衡,也就是说,您创建线程的速度与完成线程的速度相同。@jameslarge在大多数PC/服务器上,它有足够的资源来容纳100000个线程,尽管在较小的设备上,您可能会看到您所说的错误。严格地说,由于
cnt
不是
易失性的
它可能会增加,也可能不会增加。更严格地说,增量会发生,但它可能会也可能不会反映在字段中。@BoristheSpider好吧,他们至少会增量一个副本。@SachinMhetre如果您的意思是创建不停止的线程,那么您可能会得到一个OutOfMemory错误。因为您将不停地创建线程,而其他线程尚未完成。JVM仅限于您的PC规格。@sachinmheter它只是一个递归。对于任何递归,我们将得到StackOverflowException。我正在检查线程,是否也有为线程维护的堆栈。对于任何递归,我们将得到
StackOverflowException
这完全是错误的。。。递归在很多方面都很有用,如果执行正确,它不会导致任何异常……我的意思是对于普通方法,如果我们使用递归而没有正确处理它,我们将得到
StackOverflowException
。我很好奇,如果我们继续创建线程,而旧线程仍然活着,程序会因为内存不足而失败还是堆栈会溢出?