首页 > 代码库 > Java线程学习笔记(二) 线程的异常捕捉
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()方法依然没有捕捉到线程的异常,当然这个设置是合理的。而每个线程现在有了自己的异常捕捉机制,如何做到的呢,一句话,创建线程的时候就声明好~
收工!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。