Есть главный поток(1) и из него вызывается побочный поток(2)
Выглядит примерно так:
Thread second_thread = new Thread(null, new Runnable() {
public void run() {
throws new Exception();
}
});
second_thread.start();
second_thread.join();
Как узнать из главного потока, что побочный поток завершился ошибкой?
Использовать 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<Void> task = new Callable<Void> {
public Void call() throws Exception {
throws new Exception();
}
});
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Void> futureResult = executor.submit(task);
try {
futureResult.get();
}
catch (ExecutionException e) {
// анализируете причину с помощью getCause()/initCause()
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости