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
我想知道,一旦发生异常,程序将终止,对吗?
答案 0 :(得分:3)
不,你的程序没有终止,但是线程没有。
当线程抛出未捕获的异常时,它会终止。您的main
主题继续运行。
答案 1 :(得分:1)
首先,你得到的输出不是最终结果。在多线程的情况下,它取决于机器。在不同的机器上可能会出现一些不同的输出。
异常时,正在运行的线程执行终止。其他线程继续执行。
答案 2 :(得分: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)
答案 3 :(得分:0)
这是多线程的美妙!!
你编写的每个java程序都有一个运行它的线程,它通常是一个主线程。在您的情况下,您已经创建了自己的线程,其父线程是主线程。当您的子线程抛出异常时,它结束但主线程仍未完成。所以它打印是最后一个语句然后结束。
如果是线程,则无法预测行为[因为它取决于JVM从可运行池中选择项目的策略],因此您看到的顺序在不同的运行中可能会有所不同。
答案 4 :(得分:0)
如果您发现问题,那么您明确地创建了一个 t 主题。当你运行代码时main方法会运行,这里jvm也会为主类创建一个线程。这意味着代码有两个线程。一个是 t ,另一个是主类线程。这里main()线程是父线程, t 线程是子线程。由于子线程中发生异常,它将终止并且父线程将运行。因此输出可能是任何顺序。
此致 詹姆斯
答案 5 :(得分:-1)
不是程序,但是线程终止。主程序继续执行。