多线程中需要各个线程自己处理异常,外部线程是无法try-catch捕获异步线程抛出的异常,只能内部线程自己try-catch处理。但是不可能所有都自己处理,有些需要外部处理,搜寻后有几种方法。

1、自定义未捕获异常处理器

Thead确实提供了一个setUncaughtExceptionHandler方法,我们只需要将自定义未捕获异常处理器作为参数传入进入就可以了。

public class ThreadException {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.setUncaughtExceptionHandler();
        myThread.start();
    }
}

class MyThread extends Thread {
    @Override
    public void run()
    {
        System.out.println("线程名:" + Thread.currentThread().getName());

        //发生异常
        int i = 1 / 0;

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void setUncaughtExceptionHandler()
    {
        this.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("捕获线程抛出的异常:" + e.getMessage());
            }
        });
    }
}

2、线程池中自定义处理异常

本质还是自定义一个异常捕捉器,只需要为线程提供一个自定义的UncaughtExceptionHandler,线程池在创建THread的地方去设置这个UncaughtExceptionHandler就行。一直看源码追踪,可以看到,Thread其实是在ThreadFactory中被构建的。

image-20251228232812394

image-20251228232829024

所以,只用自己实现一个工厂,然后在New Thread处进行设置错误捕获就行。

public class MyThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(xxx);
        // 自定义
        t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
        return t;
    }
}

class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("捕获线程抛出的异常:" + e.getMessage());
    }
}
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐