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

(or)

run
end of method
exception

Интересно, как только возникнет исключение, программа завершится, верно?


person user617597    schedule 11.04.2011    source источник


Ответы (6)


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

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

person dogbane    schedule 11.04.2011

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

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

person Dax Joshi    schedule 24.09.2013

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

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)
person pajton    schedule 11.04.2011

В этом прелесть многопоточности!!

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

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

person Rishikesh Dhokare    schedule 16.01.2013

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

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

person Whizlabs    schedule 14.05.2013

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

person user2841950    schedule 03.10.2013