#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: Callabletask = 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 как раз созданы чтобы решить эту проблему. Вопрос разрешен.
Комментариев нет:
Отправить комментарий