OutOfMemoryError会导致生成的线程死掉吗?
它会从run()退出吗?
答案 0 :(得分:3)
如果没有捕获,任何Throwable都会导致线程终止。错误通常不会(也不应该)被捕获。
答案 1 :(得分:1)
取决于错误是在线程内还是在另一个线程内抛出。请注意以下代码段的行为:
public class Test implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("alive");
}
}
public static void main(String[] args) {
new Thread(new Test()).start();
throw new OutOfMemoryError();
}
}
你可以很容易地看到,虽然在抛出Error之后主线程会立即死亡,但是生成的线程仍然存在。但是,根本不能保证哪个线程最终会抛出错误。
答案 2 :(得分:0)
OutOfMemoryError将JavaVM设置为未定义状态。运行线程不会被规则杀死,你的线程可能仍在运行,尽管有一个错误(如果你没有捕获它)。
但线程仍然可能因为内存不足而死亡(例如,它们的堆栈框架空间不足),但这取决于剩余的空间。 JVM只是变得不稳定。
答案 3 :(得分:0)
您的线程可能会永远保持在Running状态,因为它们等待来自JVM的内存分配,但由于JVM处于不稳定状态,因此不会分配任何内容并且状态维持无限时间!