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

    收工。

  • 相关阅读:
    摘录:测试各阶段的意义
    EF Code First Migrations数据库迁移
    MVC5中Model层开发数据注解
    Easyui 中的placeholder属性
    在VS2012后的版本中做数据报表时,提示尚未指定报表“Report1”的报表定义
    MVC 中与链接相关的辅助方法(Html.ActionLink,Html.RouteLink , Url.Action , Url.Content ,Url.RouteUrl)
    Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法
    C# 常用对象的的修饰符
    C# 静态构造函数
    1、Singleton 单件(创建模式)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4578911.html
Copyright © 2011-2022 走看看