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 Threads2());
t.start();
System.out.println("End of method.");
}
}
Я предсказал результат как
run.
//exception
Но это показывает вывод как,
run
exception
end of method
(или же)
run
end of method
exception
Интересно, как только произойдет исключение, программа прекратит работу, верно?
6 ответов
Нет, ваша программа не завершается, но поток завершается.
Когда поток генерирует необработанное исключение, он завершается. Ваш main
поток продолжает работать.
Во-первых, результат, который вы получили, не является окончательным. Это зависит от машины в случае многопоточности. На другой машине может появиться другой вывод.
В случае исключения выполнение работающего потока прекращается. Другие потоки продолжают их выполнение.
Посмотреть на себя. На моей машине я получаю:
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)
Это красота многопоточности!
Каждая Java-программа, которую вы пишете, имеет запущенный поток, который обычно является основным потоком. В вашем случае вы создали свой собственный поток, родительский поток которого является основным потоком. Когда ваш дочерний поток генерирует исключение, он завершается, но основной поток все еще не завершен. Так что печатает это последнее утверждение, а затем заканчивается.
В случае потоков поведение не может быть предсказано [так как это зависит от политики JVM для выбора элементов из пула работоспособности], поэтому порядок, который вы видите, может отличаться при разных запусках.
Если вы наблюдаете за вопросом, вы создаете поток t явно. Когда вы запустите код, будет запущен метод main, здесь jvm также создаст поток для основного класса. это означает, что есть два потока для кода. один т, а другой поток основного класса. Здесь поток main() является родительским потоком, а поток t - дочерним. Поскольку исключение возникает в дочернем потоке, оно завершается, и родительский поток запускается. Таким образом, вывод может быть любого порядка.
С уважением, Джеймс
Не программа, но поток завершается. Основная программа продолжает выполнение.