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
。我很好奇,如果我们继续创建线程,而旧线程仍然活着,程序会因为内存不足而失败还是堆栈会溢出?