008 线程异常的研究

一 .概述

  我们知道一个线程运行之后,它会另外开启一个线程栈来完成自己的任务的运行,此时异常的捕获就是一个问题.


 

二 .异常的演示 

public static void main(String[] args) {
        try {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    throw new RuntimeException();
                }
            }).start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我们运行上述的程序,结果如下:  

Exception in thread "Thread-0" java.lang.RuntimeException
    at com.trek.concurrency.exception.ExceptionTest$1.run(ExceptionTest.java:10)
    at java.lang.Thread.run(Thread.java:745)

我们发现我们根本无法捕获线程抛出的异常,仅仅就是打印了一个线程的堆栈信息.


 

三 . 使用线程异常处理器完成任务 

public class ExceptionHandler {
    
    static class Handler implements UncaughtExceptionHandler{
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            //在此处我们只需要打印一下信息就好了
            System.out.println("线程的名字: "+t.getName());
            System.out.println(e);
        }
    }
    
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                throw new RuntimeException("我抛出了一个异常信息");
            }
            
        });
        thread.setUncaughtExceptionHandler(new Handler());
        thread.start();
    }
}

首先,我们定义了一个内部类为异常处理器.

  然后我们在创建线程的时候绑定一个异常处理器对象的实例.

  当我们的线程抛出一个异常的时候,异常处理器就会捕获这个异常.

我们查看结果:  

线程的名字: Thread-0
java.lang.RuntimeException: 我抛出了一个异常信息

我们发现线程抛出的异常信息我们可以捕获到了.

posted @ 2018-05-05 19:42  最爱五仁月饼  阅读(108)  评论(0编辑  收藏  举报