Как ловить исключения в FutureTask

После обнаружения этогоFutureTask работает вExecutors.newCachedThreadPool() на Java 1.6 (и из Eclipse) глотает исключения вRunnable.run() метод, я пытался придумать способ поймать их, не добавляя throw / catch для всех моихRunnable Реализации.

API предполагает, что переопределениеFutureTask.setException() должно помочь в этом:

Заставляет это будущее сообщать об исключении ExecutionException с указанным значением throwable в качестве причины, если это Future уже не было установлено или было отменено. Этот метод вызывается изнутри методом run при сбое вычисления.

Однако этот метод, кажется, не вызывается (запуск с отладчиком показывает, что исключение перехватываетсяFutureTask, ноsetException не называется). Я написал следующую программу, чтобы воспроизвести мою проблему:

public class RunTest {
    public static void main(String[] args) {
        MyFutureTask t = new MyFutureTask(new Runnable() {

            @Override
            public void run() {
                throw new RuntimeException("Unchecked exception");

            }
        });

        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(t);
    }
}

public class MyFutureTask extends FutureTask<Object> {

    public MyFutureTask(Runnable r) {
        super(r, null);
    }

    @Override
    protected void setException(Throwable t) {
        super.setException(t);
        System.out.println("Exception: " + t);
    }
}

Мой главный вопрос: как я могу поймать исключения, выброшенные в FutureTask? Почему неsetException позвонить?

Также я хотел бы знать, почемуThread.UncaughtExceptionHandler механизм не используетсяFutureTaskЕсть ли причина для этого?

Ответы на вопрос(4)

Ваш ответ на вопрос