美文网首页
统一处理子线程异常

统一处理子线程异常

作者: qyfl | 来源:发表于2020-01-14 18:17 被阅读0次

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

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();
    }
}

相关文章

  • Java 子线程异常捕获

    实现UncaughtExceptionHandler主线程可以轻松发现异常,子线程却不行。线程异常处理器的调用策略...

  • 统一处理子线程异常

    方法一(不推荐):在子线程中捕捉。 方法二(推荐):使用 UncaughtExceptionHandler Unc...

  • Java多线程: 如何捕获多线程中的异常

    你处理过多线程中异常吗?如何捕获多线程中发生的异常?捕获子线程的异常与捕获当前线程的异常一样简单吗? 除了try ...

  • spring/springmvc 全局异常处理

    1.在项目中为什么要统一异常处理 当异常返回到前端页面的时候可以统一处理,避免前端无法处理异常 不做统一异常处理,...

  • 统一异常处理

    一、什么是统一异常处理 1、制造异常 2、什么是统一异常处理我们想让异常结果也显示为统一的返回结果对象,并且统一处...

  • Java多线程异常处理

    线程异常处理 Java中每个线程的异常处理是相互独立的,一个线程产生的异常不会影响其他线程的正常运行。因此,也不能...

  • springboot全局异常处理

    一、单个controller范围的异常处理/** 统一异常处理 @return*/@RequestMapping(...

  • Java线程系列——线程异常处理

    1.子线程中处理异常的弊端 多线程抛出的异常,容易在主线程大量的日志打印中丢失,给日志排查带来了一定的困难。如下面...

  • springboot之统一异常处理

    spring统一异常处理 使用spring的统一异常处理,我们就不再需要在业务代码中就行显式的捕获异常处理,在da...

  • 统一异常处理

    1.定义返回结果对象 2.定义返回结果工具类, 3.枚举消息状态 .4.自定义异常类 5.统一异常拦截 6.业务中...

网友评论

      本文标题:统一处理子线程异常

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