Обработка исключений из задач Java ExecutorService - PullRequest
187 голосов
/ 12 февраля 2010

Я пытаюсь использовать класс Java ThreadPoolExecutor для выполнения большого количества тяжеловесных задач с фиксированным числом потоков. У каждой из задач есть много мест, в которых она может завершиться неудачей из-за исключений.

Я вложил в подкласс ThreadPoolExecutor и переопределил метод afterExecute, который должен обеспечивать любые неперехваченные исключения, встречающиеся при запуске задачи Однако я не могу заставить его работать.

Например:

public class ThreadPoolErrors extends ThreadPoolExecutor {
    public ThreadPoolErrors() {
        super(  1, // core threads
                1, // max threads
                1, // timeout
                TimeUnit.MINUTES, // timeout units
                new LinkedBlockingQueue<Runnable>() // work queue
        );
    }

    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        if(t != null) {
            System.out.println("Got an error: " + t);
        } else {
            System.out.println("Everything's fine--situation normal!");
        }
    }

    public static void main( String [] args) {
        ThreadPoolErrors threadPool = new ThreadPoolErrors();
        threadPool.submit( 
                new Runnable() {
                    public void run() {
                        throw new RuntimeException("Ouch! Got an error.");
                    }
                }
        );
        threadPool.shutdown();
    }
}

Вывод этой программы: "Все хорошо - ситуация нормальная!" даже если единственный Runnable, представленный в пул потоков, генерирует исключение. Любой ключ к тому, что здесь происходит?

Спасибо!

Ответы [ 11 ]

0 голосов
/ 12 февраля 2010

Вместо создания подкласса ThreadPoolExecutor я бы предоставил ему экземпляр ThreadFactory , который создает новые потоки и предоставляет им UncaughtExceptionHandler

...