zoukankan      html  css  js  c++  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()该方法仍然没有捕捉到异常的线程,当然,这个设置是合理的。现在每个线程都有自己的异常处理机制,怎么办呢,句子,创建一个线程时,该语句是好的~

    收工。

  • 相关阅读:
    python之面向对象之类变量和实例变量
    python之面向对象之封装
    python之shutil模块
    利用python实现冒泡排序
    利用python实现二分法和斐波那契序列
    thinkphp input
    从右向左
    全局修改composer源地址
    Git忽略规则及.gitignore规则不生效的解决办法
    mysql主从数据库不同步的2种解决方法 (转载)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4578911.html
Copyright © 2011-2022 走看看