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

229
05 мая 2017, 16:29

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

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

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

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

Answer 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<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()
}
READ ALSO
Использование атрибутов

Использование атрибутов

Как я могу использовать данный атрибут для другой вьюшки?

221
Mybathis 3 set null params as empty string

Mybathis 3 set null params as empty string

Настраиваю Mybathis 3 в связке с PostgreSQL при попытке совершить insert в базу обнаружилась неприятная особенность: вместо null в запросе были сформированы...

266
Как через библиотеку gson взять 3 элемент?

Как через библиотеку gson взять 3 элемент?

// --- String input = text; JsonParser parser = new JsonParser(); JsonObject mainObject = parserparse(input)

364