zoukankan      html  css  js  c++  java
  • JDK线程池异常处理方式

    1. 抛出异常

    execute()

    java.util.concurrent.ThreadPoolExecutor#runWorker 中抛出,抛出之后经过以下两个步骤:

    catch块捕获,捕获之后再抛出给JVM,JVM调用java.lang.Thread#dispatchUncaughtException 处理;

      dispatchUncaughtException最后将异常交给uncaughtExceptionHandler处理,这意味着可以自定义uncaughtExceptionHandler处理异常;

    finally块里调用java.util.concurrent.ThreadPoolExecutor#afterExecute 处理。

      此方法是一个protected方法,意味着子类可以覆盖afterExecute 方法,实现自己的异常处理逻辑。

     

    submit()

    java.util.concurrent.FutureTask#run 中抛出异常后会被捕获,不会抛给JVM,而是调用setException方法将异常设置给输出outcome;

    最后调用java.util.concurrent.FutureTask#get() 获取线程运行结果时将异常抛出

    2. 异常处理方式

    execute()

      a.业务代码内部try-catch处理

      b.自定义线程的uncaughtExceptionHandler

      c.覆盖线程池的afterExecute()方法

    submit()

      业务代码内部try-catch处理

  • 相关阅读:
    POJ3040--Allowance(贪心)
    Deep work
    湾区公司上班第一周
    三个现场面试
    协商薪资
    调节情绪,精神愉悦,健康快乐
    Phone interview guide 多说
    Campus Bikes
    降低软件复杂度 和 写注释写总结 2019-10
    某厂在线测试 2019.09.26
  • 原文地址:https://www.cnblogs.com/songwenlong/p/15775121.html
Copyright © 2011-2022 走看看