Java SCJP:未捕获异常后程序未终止

Java SCJP:未捕获异常后程序未终止,java,multithreading,scjp,Java,Multithreading,Scjp,我预测输出为 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 Threa

我预测输出为

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
end of method
exception

不,程序不会终止,但线程会终止


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

这就是多线程的美妙之处

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


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

如果您观察到这个问题,您将显式创建一个线程t。当您运行main方法将运行的代码时,这里jvm也将为main类创建一个线程。这意味着代码有两个线程。一个是t,另一个是主类线程。这里main()线程是父线程,t线程是子线程。当异常发生在子线程中时,它将被终止,父线程将运行。因此,输出可能是任意顺序

问候,,
詹姆斯首先,你得到的不是最终结果。多线程情况下,这取决于机器。在不同的机器上可能会有不同的输出


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

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

run
end of method
exception
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)