Как ловить исключения в 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
Есть ли причина для этого?