1
public class Threads2 implements Runnable {

    public void run() {
        System.out.println("run.");
        throw new RuntimeException("Problem");
    }

    public static void main(String[] args) {
        Thread t = new Thread(new Threads2());
        t.start();
        System.out.println("End of method.");
    }
}

我预测输出为

run.
//exception

但它显示输出为,

run
exception
end of method

(或者)

run
end of method
exception

我想知道,一旦发生异常,程序就会终止,对吗?

4

6 回答 6

3

不,您的程序不会终止,但线程会终止。

当线程抛出未捕获的异常时,它会终止。您的main线程继续运行。

于 2011-04-11T14:11:01.187 回答
1

首先,你得到的输出不是最终的。在多线程的情况下,它取决于机器。在不同的机器上,可能会出现一些不同的输出。

异常时,正在运行的线程执行终止。其他线程继续执行。

于 2013-09-24T08:39:59.000 回答
0

如果您观察到您正在明确创建线程t的问题。当你运行代码时 main 方法会运行,这里 jvm 也会为 main 类创建一个线程。这意味着代码有两个线程。一个是t,另一个是主类线程。这里 main() 线程是父线程,t线程是子线程。由于异常发生在子线程中,它被终止并且父线程将运行。所以输出可能是任何顺序。

问候,詹姆斯

于 2013-05-14T13:09:12.533 回答
0

这就是多线程的魅力!!

您编写的每个 java 程序都有一个运行它的线程,该线程通常是一个主线程。在您的情况下,您创建了自己的线程,其父线程是主线程。当您的子线程抛出异常时,它会结束,但主线程仍未完成。所以它打印的是最后一条语句,然后结束。

在线程的情况下,无法预测行为[因为它取决于 JVM 从可运行池中选择项目的策略],因此您看到的顺序在不同的运行中可能会有所不同。

于 2013-01-16T18:40:32.123 回答
0

你自己看。在我的机器上,我得到:

bartek@dragon:~/workspace/sandbox$ java Threads2 
End of method.
run.
Exception in thread "Thread-0" java.lang.RuntimeException: Problem
    at Threads2.run(Threads2.java:5)
    at java.lang.Thread.run(Thread.java:636)
于 2011-04-11T13:57:39.720 回答
-1

不是程序,而是线程终止。主程序继续执行。

于 2013-10-03T09:13:37.133 回答