chapter07_取消与关闭_3_处理非正常的线程终止

  • 任何代码都可能抛出RuntimeException,所以每当调用另一个方法时,都要对它的行为保持怀疑

  • 两种方式处理可能的非正常线程终止情况

    (1) 把任务套在try块中,如果抛出异常先通知一下框架该线程已经终结

    线程池和Swing都用了这个方法

    线程池__工作者线程__的伪代码

      public void run() {
    
          Throwable thrown = null;
    
          try {
    
              while (!isInterrupted()) {
    
                  runTask(getTaskFromWorkQueue());   //主体部分
              }
          } catch (Throwable e) {
              thrown = e;
          } finally {
    
              threadExited(this, thrown);       //通知框架当前线程的终止信息
          }
    

    (2) 实现UncaughtExceptionHandler接口,当某个线程由于未捕获异常而退出时,JVM将事件报告给UncaughtExceptionHandler的实现类处理

    示例

      public class UEHLogger implements Thread.UncaughtExceptionHandler {
    
          public void uncaughtException(Thread t, Throwable e) {
    
              Logger logger = Logger.getAnonymousLogger();
              logger.log(Level.SEVERE, "Thread terminated with exception: " + t.getName(), e);
          }
      }
    

    注:

    使用execute()方法提交的任务,如果抛出未捕捉异常会触发UncaughtExceptionHandler;但是使用submit()方法抛出的未捕捉异常不会交给UncaughtExceptionHandler,而是把异常封装进Future对象中,作为Future.get()的ExecutionException

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值