统一处理子线程异常

方法一(不推荐):在子线程中捕捉。

public class CantCatchDirectly implements Runnable {

    public static void main(String[] args) throws InterruptedException {
        new Thread(new CantCatchDirectly(), "MyThread-1").start();
        Thread.sleep(100);
        new Thread(new CantCatchDirectly(), "MyThread-2").start();
        Thread.sleep(100);
        new Thread(new CantCatchDirectly(), "MyThread-3").start();
        Thread.sleep(100);
        new Thread(new CantCatchDirectly(), "MyThread-4").start();
    }


    @Override
    public void run() {
        try {
            throw new RuntimeException();
        } catch (Exception e) {
            System.out.println("捕捉异常");
        }
    }
}

方法二(推荐):使用 UncaughtExceptionHandler

UncaughtExceptionHandler 配置

uncaughtException 方法里是捕获到异常后处理方法,这里打印出来只是示例。实际上可以发邮件,电话告警,包装成统一的异常类型,做法很多。

public class MyUncaughtExceptionHanlder implements Thread.UncaughtExceptionHandler {
    private String name;

    public MyUncaughtExceptionHanlder(String name) {
        this.name = name;
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println(t.getName() + "线程异常终止了");
        System.out.println(name + "捕获了异常" + e);
    }
}

使用方式有三种

  • 给程序统一设置。
  • 给线程池设置。
  • 给每个线程单独设置(不推荐)。
使用 MyUncaughtExceptionHanlder,程序统一设置。
public class UseOwnUncaughtExceptionHandler implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHanlder("捕获器1"));

        new Thread(new UseOwnUncaughtExceptionHandler(), "MyThread-1").start();
        Thread.sleep(100);
        new Thread(new UseOwnUncaughtExceptionHandler(), "MyThread-2").start();
        Thread.sleep(100);
        new Thread(new UseOwnUncaughtExceptionHandler(), "MyThread-3").start();
        Thread.sleep(100);
        new Thread(new UseOwnUncaughtExceptionHandler(), "MyThread-4").start();
    }

    @Override
    public void run() {
        throw new RuntimeException();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、前言 线程池技术是服务器端开发中常用的技术。不论是直接还是间接,各种服务器端功能的执行总是离不开线程池的调度。...
    幽澜先生阅读 885评论 0 0
  • Java使用ThreadGroup来表示线程组,它可以对一批线程进行分类和管理,Java允许程序直接对线程组进行控...
    BlueSkyBlue阅读 408评论 0 0
  • 执行多线程并发任务的时候,如果任务类型相同,一般会考虑使用线程池,一方面利用了并发的优势,一方面避免创建大量线程得...
    德彪阅读 23,584评论 2 19
  • 之前使用线程执行任务的时候,总是忽略了线程异常的处理,直到最近看书 线程出现异常测试类 任务类:Task.java...
    何甜甜在吗阅读 462评论 0 0
  • 你有梦想么?我想我有过那么,现在呢?我想,我现在只想好好的活着 人就是这样,当越长大时,经历的事情越多,越容易对生...
    妖冶之曼珠沙华阅读 280评论 0 2