学习《java编程思想》的Executor捕获异常的时候,发现代码输出跟书上有出入,于是就研究了一下Executor的机制。
(一)异常捕获实例
1、异常处理类MyUncaughtExceptionHandler
public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("I caught: " + e);
}
}
线程抛出异常的时候,会由MyUncaughtExceptionHandler类的uncaughtException方法捕获异常,在方法里可以对异常进行处理,参数Thread为抛出异常的线程,throwable为异常。
2、线程工厂类HandlerThreadFactory
public class HandlerThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
System.out.println(1);
return t;
}
}
通过线程工厂创建的线程,都有统一的配置,比如,设置守护线程,异常处理器等。这里,为所有线程设置统一个异常处理器MyUncaughtExceptionHandler
3、任务线程类ExceptionThread
public class ExceptionThread implements Runnable {
@Override
public void run() {
System.out.println(2);
throw new RuntimeException();
}
}
线程的run方法抛出异常。在正常情况下,这个异常是无法捕获的,但是在Executor的帮助下,该异常可以捕获。
4、场景类
public class CaptureUncaughtException {
public static void main(String[] args) throws InterruptedExcep