Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Как узнать из главного потока, что побочный поток завершился ошибкой?

#java #многопоточность


Есть главный поток(1) и из него вызывается побочный поток(2)

Выглядит примерно так:

   Thread second_thread = new Thread(null, new Runnable() {
            public void run() {
                throws new Exception();
            }
        });
second_thread.start();
second_thread.join();


Как узнать из главного потока, что побочный поток завершился ошибкой?
    


Ответы

Ответ 1



Использовать Thread.UncaughtExceptionHandler: Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread th, Throwable ex) { System.out.println("Uncaught exception: " + ex); } }; Thread second_thread = new Thread(null, new Runnable() { public void run() { throws new Exception(); } }); second_thread.setUncaughtExceptionHandler(h); second_thread.start(); second_thread.join(); Диаграмма жизни потока при возникшем исключении: Отсюда UPD Если исключение нужно получить в "родительском" потоке, то нужно использовать Callable и ExecutionContext: Callable task = new Callable { public Void call() throws Exception { throws new Exception(); } }); ExecutorService executor = Executors.newSingleThreadExecutor(); Future futureResult = executor.submit(task); try { futureResult.get(); } catch (ExecutionException e) { // анализируете причину с помощью getCause()/initCause() }

Ответ 2



Классы Callable и Future как раз созданы чтобы решить эту проблему. Вопрос разрешен.

Комментариев нет:

Отправить комментарий