【线程】Thread.UncaughtExceptionHandler 实战与剖析 (十八)

我的原则:先会用再说,内部慢慢来。
学以致用,根据场景学源码


一、前言

1.1 架构

在这里插入图片描述

  • java.lang.Thread.UncaughtExceptionHandler

=== 点击查看top目录 ===

1.2 Class 架构
public class Thread implements Runnable {
    
    
 @FunctionalInterface
    public interface UncaughtExceptionHandler {
    
    
        void uncaughtException(Thread t, Throwable e);
    }
}

=== 点击查看top目录 ===

1.3 能干嘛?
  1. 捕获子线程抛出的异常

=== 点击查看top目录 ===

二、实战 demo

2.1 实战一:测试 Exception 逃逸
  • 代码
public class _01_TestMultiThreadException {
    
    
    // 现象:控制台打印出异常信息,并运行一段时间后才停止
    public static void main(String[] args) {
    
    
        // 就算把线程的执行语句放到 try-catch 块中也无济于事
        try {
    
    
            ExecutorService exec = Executors.newCachedThreadPool();
            exec.execute(() -> {
    
    
                throw new RuntimeException("自定义的一个RuntimeException");
            });
            exec.shutdown();
        } catch (Exception e) {
    
    
            System.out.println("Exception has been handled!");
        }
    }
}
  • 解析:上方的 try-catch 压根没法捕获到子线程抛出的 Exception

  • 结论:

  1. 多线程运行不能按照顺序执行过程中捕获异常的方式来处理异常, 异常会被直接抛出到控制台。
  2. 由于线程的本质,使得你不能捕获从线程中逃逸的异常。一旦异常逃逸出任务的run方法,它就会向外传播到控制台,除非你采用特殊的形式捕获这种异常。

=== 点击查看top目录 ===

2.2 实战二:自定义 UncaughtExceptionHandler
  1. 步骤一:定义“异常处理器” UncaughtExceptionHandler
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    
    
    /*
        Thread.UncaughtExceptionHandle.uncaughtException()
            会在线程因未捕获的异常而临近死亡时被调用
     */
    @Override
    public void uncaughtException(Thread t, Throwable e) {
    
    
        // 这里可以写 if else 处理各种各样的异常
        if(e instanceof RuntimeException){
    
    
            System.out.println("### MyUncaughtExceptionHandler catch " + e);
        }
    }
}
  1. 步骤二:定义线程工厂 ThreadFactory
  • 工厂就是用来产生线程的,并给生成的线程绑定一个异常处理器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值