java 多线程系列文章列表, 请查看目录: 《java 多线程学习笔记》
1. 线程的异常捕获
1.1 线程异常的捕获
- 从java5 开始, Java 加强了对线程异常的处理. 如果线程执行过程中抛出了一个未处理的异常, JVM在结束该线程之前, 会自动查找该线程是否拥有对应的线程异常处理器对象, 若找到之后, 则调用异常处理器的方法处理异常.
- java5 之前通常都会使用try-catch, 包裹run()/callable()方法, 这样代码会有些臃肿
1.2 设置异常处理器
Thread 提供了两个方法来设置线程异常处理器:
- public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh): 为该线程类的所有实例设置默认的异常处理器
- public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) : 为指定的线程实例设置异常处理器.
1.3 异常处理器顺序
- 如果线程对象设置了异常处理器, 则优先使用线程对象的异常处理器
- 如果线程对象未设置异常处理器, 但是线程类设置了异常处理器, 则使用线程类的异常处理器
- 如果线程类也未设置异常处理器, 则调用父线程组的uncaughtException方法. 线程组ThreadGroup 实现了UncaughtExceptionHandler 接口
2.1 自定义线程异常
2.2 测试用例
public class ThreadExcp {
static class MyThread extends Thread{
@Override
public void run() {
int a = 1/0;
}
}
public static void main(String[] args) {
// 1. 线程类默认异常处理器
Thread.UncaughtExceptionHandler defaultEh = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("默认异常处理器-捕获到了异常.." + e.getMessage());
}
};
// 2. 线程对象异常处理器
Thread.UncaughtExceptionHandler objEh = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("私有异常处理器-捕获到了异常.." + e.getMessage());
}
};
// 设置默认异常处理器
MyThread.setDefaultUncaughtExceptionHandler(defaultEh);
MyThread myThread = new MyThread();
// 设置类对象异常处理器
myThread.setUncaughtExceptionHandler(objEh);
// 启动线程
myThread.start();
}
}
2.2 输出
从输出结果可以看出, 优先使用线程对象的异常处理器.
私有异常处理器-捕获到了异常../ by zero