Java多线程 自己实现异常处理器

自己实现异常处理器

自己实现异常处理器有三种方式 :

  1. 程序统一设置
  2. 每个线程单独设置
  3. 每个线程池单独设置

一般开发中使用第一个, 2和3除非有特殊的需求, 可以做.

编写自己的MyUncaughtExceptionHanlder

编写自己的MyUncaughtExceptionHanlder代码如下.
主要是MyUncaughtExceptionHandler 实现了Thread类的 Thread.UncaughtExceptionHandler接口.
重写了uncaughtException 方法.
在此方法类, 可以对线程的异常做一些操作. 例如在生产环境中 , 可以记录异常日志. 把异常报警信息给异常系统, 让工作人员知道发生了异常.
此处只是打印了线程和异常信息
同时设置了一个成员变量, 用于设置 异常捕获器的名称.

package com.thread.uncaughtexception;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 类名称:MyUncaughtExceptionHandler
 * 类描述:  自己的线程异常处理器
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2020/8/30 19:43
 * Version 1.0
 */
public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {

    // 异常处理器的名字
    private String name;

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

    @Override
    public void uncaughtException(Thread thread, Throwable e) {
        Logger logger = Logger.getAnonymousLogger();
        logger.log(Level.WARNING," 线程异常,终止"+thread.getName(),e);

        System.out.println(name +"捕获了异常" + thread.getName()+"异常"+e);

    }
}

使用自己的UncaughtExceptionHandler

如下的代码中, 使用了自己的UncaughtExceptionHandler . 从而不需要任何一行的try catch代码.

主要的代码为设置了自己的异常处理器Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler("线程异常捕获器"));

package com.thread.uncaughtexception;

/**
 * 类名称:UseOwnUncaughtExceptionHandler
 * 类描述:  使用自己的UncaughtExceptionHandler
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2020/8/30 19:48
 * Version 1.0
 */
public class UseOwnUncaughtExceptionHandler implements Runnable {

    public static void main(String[] args) throws InterruptedException {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler("线程异常捕获器"));

        new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-1").start();

        Thread.sleep(300);

        new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-2").start();

        Thread.sleep(300);
        new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-3").start();

        Thread.sleep(300);

        new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-4").start();
    }

    @Override
    public void run() {

        throw new RuntimeException();

    }


}

控制台打印如下 , 成功的捕获了异常, 并且打印了异常信息.

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/108309969