Cómo atrapar excepciones en FutureTask

Después de encontrar esoFutureTask corriendo en unExecutors.newCachedThreadPool() en Java 1.6 (y desde Eclipse) traga excepciones en elRunnable.run() método, he tratado de encontrar una manera de atraparlos sin agregar throw / catch a todos misRunnable implementaciones

La API sugiere que anularFutureTask.setException() debería ayudar en esto:

Hace que este futuro informe una ExecutionException con el objeto arrojado dado como su causa, a menos que este futuro ya se haya establecido o se haya cancelado. Este método es invocado internamente por el método de ejecución al fallar el cálculo.

Sin embargo, este método no parece llamarse (la ejecución con el depurador muestra que la excepción es detectada porFutureTask, perosetException no se llama). He escrito el siguiente programa para reproducir mi 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);
    }
}

Mi pregunta principal es: ¿Cómo puedo detectar excepciones lanzadas en una FutureTask? Por qué nosetException ser llamado?

También me gustaría saber por quéThread.UncaughtExceptionHandler mecanismo no es utilizado porFutureTask, ¿Hay alguna razón para esto?

Respuestas a la pregunta(4)

Su respuesta a la pregunta