• 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()方法依旧没有捕捉到线程的异常。当然这个设置是合理的。

    而每一个线程如今有了自己的异常捕捉机制,怎样做到的呢,一句话。创建线程的时候就声明好~

    收工!


  • 相关阅读:
    [译] 11. 流复制
    [译] 8. PG缓冲区管理器(Buffer Manager)
    [译] 6. Vacuum 处理
    centos 7 安装gitlab
    linux 源码安装git
    SonarQube
    百度Paddle速查_CPU和GPU的mnist预测训练_模型导出_模型导入再预测_导出onnx并预测
    Torch速查_CPU和GPU的mnist预测训练_模型导出_模型导入再预测_导出script并预测_导出onnx并预测
    Mxnet速查_CPU和GPU的mnist预测训练_模型导出_模型导入再预测_导出onnx并预测
    Chainer速查_CPU和GPU的mnist预测训练_模型导出_模型导入再预测_导出onnx并预测
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10899949.html
Copyright © 2020-2023  润新知