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

本文详细介绍了在Java中自定义异常处理器的方法,包括实现Thread.UncaughtExceptionHandler接口,重写uncaughtException方法以处理未捕获的异常。通过示例代码展示了如何设置全局异常处理器,以及在运行时成功捕获并打印异常信息。

自己实现异常处理器

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

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

    }


}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值