美文网首页
ThreadPoolExecutor捕获线程执行失败抛出的异常

ThreadPoolExecutor捕获线程执行失败抛出的异常

作者: 逆水处行舟 | 来源:发表于2019-01-16 15:38 被阅读0次

当我们通过submit提交任务到线程池,如果线程失败,我们怎么去捕获这个失败而抛出来的异常呢

方法1:通过调用返回对象 FutureTask的get方法**

  • FutureTask.get() will re-throw any exception thrown by the task as an ExecutorException

  • 缺点:该方法是阻塞调用,会阻塞提交任务的线程

方法2:在提交的线程任务的 run() or call()使用 try{}catch{}Exceptoion{}进行处理

Executors.newCachedThreadPool().submit(new Callable<Integer>() {

        @Override

        public Integer call() throws Exception {

                try {

                        int a = 1 / 0;

                        return 1;

                    } catch (Exception e) {

                            e.printStackTrace();

                    } finally {

                       //you can do something here,e.g.  log execution

                    }

                return 0;

         }

});

方法3:改写ThreadPoolExecutor的afterExecute方法

方法示例来自jdk的ThreadPoolExecutor的afterExecute方法注释

class ExtendedExecutor extends ThreadPoolExecutor {

   // ...

   protected void afterExecute(Runnable r, Throwable t) {

       super.afterExecute(r, t);

       if (t == null && r instanceof Future<?>) {

            try {

                   Object result = ((Future<?>) r).get();

            } catch (CancellationException ce) {

                  t = ce;

            } catch (ExecutionException ee) {

                  t = ee.getCause();

             catch (InterruptedException ie) {

                 Thread.currentThread().interrupt(); // ignore/reset

            }

       }

      if (t != null)

            System.out.println(t);

      }

}

参考资料:https://stackoverflow.com/questions/2554549/handling-exceptions-for-threadpoolexecutor

相关文章

  • ThreadPoolExecutor捕获线程执行失败抛出的异常

    当我们通过submit提交任务到线程池,如果线程失败,我们怎么去捕获这个失败而抛出来的异常呢 方法1:通过调用返回...

  • 2019-12-20

    1、多线程中怎么捕获子线程中的异常?这个问题大家会经常遇到,子线程在执行过程中抛出了异常,但是主线程并没有捕获到。...

  • Java-异常处理的理解

    #何时捕获何时抛出 当需要继续执行是就捕获,不需要继续执行就抛出异常,下面的代码就不会接着执行了

  • 【多线程】java线程的未捕获异常,JVM处理机制

    当线程出现未捕获异常(即抛出一个异常) JVM将调用Thread.dispatchUncaughtExceptio...

  • Promise捕获错误

    1.捕获执行器异常 2.then函数抛出异常 3.异步情况的处理

  • 记一次spring嵌套事务的异常

    异常原因 执行嵌套事务时,由于嵌套的事务方法出错,在上层方法捕获了抛出的异常,spring依旧抛出了一个异常。 异...

  • 调用线程不可捕捉异步线程的异常,如何处理?

    一 背景描述 Java的异常在线程之间不是共享的,在线程中抛出的异常是线程自己的异常,主线程并不能捕获到。也就是说...

  • Java如何捕获线程异常

    首先,我们要知道,在Java中,线程中的异常是不能抛出到调用该线程的外部方法中捕获的。 为什么不能抛出到外部线程捕...

  • Dart - 异常

    Dart 代码可以抛出和捕获异常。异常表示一些未知的错误情况,如果异常没有捕获则会被抛出从而导致抛出异常的代码终止...

  • dart 异常

    dart中的异常 异常处理 抛出异常 异常捕获

网友评论

      本文标题:ThreadPoolExecutor捕获线程执行失败抛出的异常

      本文链接:https://www.haomeiwen.com/subject/grumdqtx.html