线程异常的捕捉:
正常的情况下,我们在main()方法里是捕捉不到线程的异常的,比如以下代码:
public class ExceptionThread implements Runnable{
@Override
public void run() {
throw new NullPointerException();
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
try {
System.out.println("运行线程");
executorService.execute(new ExceptionThread());
} catch (Exception e) {
e.printStackTrace();
System.out.println("捕捉异常");
}
}
}
上述代码并不能在main方法里捕捉线程异常,那么我们怎么才干捕捉到线程的异常信息呢?以下我们看这段代码
上面的输出结果是/** * 定义异常线程内容 */ class MyExceptionThread implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { // 捕捉异常后的业务处理放在这里 System.out.println("捕捉的异常信息例如以下"); System.out.println(e); } } /** * 定义异常线程工厂 */ class ExceptionThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); // 此处是捕捉异常的设置。
thread.setUncaughtExceptionHandler(new MyExceptionThread()); return thread; } } /** * 运行线程 */ class ExceptionThread2 implements Runnable{ @Override public void run() { try { Thread.sleep(1000l); } catch (InterruptedException e) { e.printStackTrace(); } // 抛出异常 throw new NullPointerException(); } public static void main(String[] args) { // 通过我们自己写的ExceptionThreadFactory线程工厂,构造线程池 ExecutorService executorService = Executors.newCachedThreadPool(new ExceptionThreadFactory()); try { System.out.println("运行线程"); // 启动三个线程 executorService.execute(new ExceptionThread2()); executorService.execute(new ExceptionThread2()); executorService.execute(new ExceptionThread2()); } catch (Exception e) { e.printStackTrace(); System.out.println("捕捉异常"); } } }
运行线程
捕捉的异常信息例如以下
java.lang.NullPointerException
捕捉的异常信息例如以下
java.lang.NullPointerException
捕捉的异常信息例如以下
java.lang.NullPointerException
结论就是:main()方法依旧没有捕捉到线程的异常。当然这个设置是合理的。而每一个线程如今有了自己的异常捕捉机制,怎样做到的呢,一句话。创建线程的时候就声明好~
收工!