Como capturar exceções no FutureTask

Depois de descobrir queFutureTask correndo em umExecutors.newCachedThreadPool() no Java 1.6 (e do Eclipse) engole exceções no diretórioRunnable.run() método, tentei encontrar uma maneira de capturá-los sem adicionar throw / catch a todos os meusRunnable implementações.

A API sugere que a substituiçãoFutureTask.setException() deve ajudar nisso:

Faz com que este futuro relate uma ExecutionException com o lançamento possível como sua causa, a menos que este futuro já tenha sido definido ou cancelado. Este método é chamado internamente pelo método run, após falha do cálculo.

No entanto, esse método não parece ser chamado (a execução com o depurador mostra que a exceção é capturada peloFutureTask, massetException não é chamado). Eu escrevi o seguinte programa para reproduzir o meu problema:

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);
    }
}

Minha principal pergunta é: Como capturar exceções lançadas em uma FutureTask? Por que nãosetException ser chamado?

Também gostaria de saber por que oThread.UncaughtExceptionHandler mecanismo não é usado porFutureTask, Existe alguma razão para isso?

questionAnswers(4)

yourAnswerToTheQuestion