码迷,mamicode.com
首页 > 编程语言 > 详细

Java线程学习笔记(二) 线程的异常捕捉

时间:2014-07-14 11:18:30      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:线程   线程异常   

线程异常的捕捉:

正常的情况下,我们在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()方法依然没有捕捉到线程的异常,当然这个设置是合理的。而每个线程现在有了自己的异常捕捉机制,如何做到的呢,一句话,创建线程的时候就声明好~

收工!

Java线程学习笔记(二) 线程的异常捕捉,布布扣,bubuko.com

Java线程学习笔记(二) 线程的异常捕捉

标签:线程   线程异常   

原文地址:http://blog.csdn.net/zhao9tian/article/details/37745435

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!