How to catch exceptions in FutureTask

前端 未结 5 740
小蘑菇
小蘑菇 2020-12-06 04:42

After finding that FutureTask running in a Executors.newCachedThreadPool() on Java 1.6 (and from Eclipse) swallows exceptions in the Runnable

5条回答
  •  抹茶落季
    2020-12-06 05:02

    There are three standard ways and one improvised way. 1. use UncaughtExceptionHandler, set the UncaughtExceptionHandler for the created thread as

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                public void uncaughtException(Thread t, Throwable ex) {..}}
    

    *But the limitation is it catches the exception thrown by thread but in case of future task, it is swallowed. 2. use afterExecute after making a custom threadpoolexecutor with hook that has been provided specially for this purpose. Looking through the code of ThreadpoolExecutor, via submit > execute (there is a workQueue, workQueue.offer), the tasks are added to the work queue

       final void runWorker(Worker arg0) {
      Thread arg1 = Thread.currentThread();
      Runnable arg2 = arg0.firstTask;
      ..
         while(arg2 != null || (arg2 = this.**getTask()**) != null) {
            arg0.lock();
            ..
            try {
               this.beforeExecute(arg1, arg2);
               Object arg4 = null;
               try {
                  arg2.run();
               } catch (RuntimeException arg27) {
                 ..
               } finally {
                  this.**afterExecute**(arg2, (Throwable)arg4);
               }
    
      }
    
    getTask() {..
     this.workQueue.**poll**();
    ..}
    
    1. Then, the third is using simple try catch inside the call method but you can not catch the exception outside here.

    2. The workaround is calling all the call methods from a call method of a TaskFactory, a factory that releases callables.

提交回复
热议问题