线程异常的捕捉:
正常的情况下,我们在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()方法依然没有捕捉到线程的异常,当然这个设置是合理的。而每个线程现在有了自己的异常捕捉机制,如何做到的呢,一句话,创建线程的时候就声明好~
收工!