SCJP: Программа не завершается после необработанного исключения - PullRequest
1 голос
/ 11 апреля 2011
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 ]

3 голосов
/ 11 апреля 2011

Нет, ваша программа не завершается, но поток завершается.

Когда поток генерирует необработанное исключение, он завершается. Ваш поток main продолжает работать.

1 голос
/ 24 сентября 2013

Во-первых, результат, который вы получили, не является окончательным.Это зависит от машины в случае многопоточности.На другом компьютере может появиться другой вывод.

В исключительных случаях выполнение работающего потока прекращается.Другие потоки продолжают свое выполнение.

0 голосов
/ 03 октября 2013

Не программа, но поток завершается.Основная программа продолжает выполнение.

0 голосов
/ 14 мая 2013

Если вы наблюдаете за вопросом, вы явно создаете тему t .Когда вы запустите код, будет запущен метод main, здесь jvm также создаст поток для основного класса.это означает, что есть два потока для кода.один - t , а другой - поток основного класса.Здесь поток main () является родительским потоком, а поток t является дочерним потоком.Поскольку исключение возникает в дочернем потоке, оно завершается, и родительский поток запускается.Таким образом, вывод может быть любого порядка.

С уважением, Джеймс

0 голосов
/ 16 января 2013

Это красота многопоточности !!

Каждая Java-программа, которую вы пишете, имеет запущенный поток, который обычно является основным потоком. В вашем случае вы создали свой собственный поток, родительский поток которого является основным потоком. Когда ваш дочерний поток генерирует исключение, он завершается, но основной поток все еще не завершен. Так что печатается это последнее утверждение, а затем заканчивается.

В случае потоков поведение не может быть предсказано [так как это зависит от политики JVM для выбора элементов из пула работоспособности], поэтому порядок, который вы видите, может отличаться в разных прогонах.

0 голосов
/ 11 апреля 2011

Убедитесь сами. На моей машине я получаю:

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)
...