【JUC】多线程中如何进行异常处理?
2025/12/28...大约 1 分钟
多线程中需要各个线程自己处理异常,外部线程是无法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中被构建的。


所以,只用自己实现一个工厂,然后在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());
}
}