Java线程学习笔记(两) 线程异常处理
线程捕获异常:
情况下,我们在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()该方法仍然没有捕捉到异常的线程,当然,这个设置是合理的。现在每个线程都有自己的异常处理机制,怎么办呢,句子,创建一个线程时,该语句是好的~
收工。