并发编程回顾:捕获线程异常

原先多线程并发编程的学习笔记和代码整理一下贴上来。
---------------------------------

捕获线程异常

javase5提供了一个新接口Thread.UncaughtExceptionHandler,该接口当Thread因未捕获的异常而突然终止时,调用处理程序。
举例:
首先定义一个任务。

class ExceptionThread implements Runnable{
    @Override
    public void run(){
	System.out.println("current thread name:"+Thread.currentThread().getName());
	throw new RuntimeException();
    }
}

该任务在执行run方法时抛出一个RuntimeException,用来测试线程异常的捕获。
实现Thread.UncaughtExceptionHandler接口,处理捕获的异常:

class CustomUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
	@Override
	public void uncaughtException(Thread t, Throwable e) {
	    System.out.println("thread name:" + t.getName());
	    System.out.println("throwable:" + e);
	}
}

这个异常处理器只是将抛出异常线程的名称和异常信息打印出来。
下面要对每个创建的线程都设置异常处理器,就需要使用到ThreadFactory。
使用ThreadFactory就无需再手工编写对new Thread的调用了,从而允许应用程序使用特殊的线程子类、属性等等。

class HandlerThreadFactory implements ThreadFactory{
	@Override
	public Thread newThread(Runnable r) {
		Thread t=new Thread(r);
		t.setUncaughtExceptionHandler(new CustomUncaughtExceptionHandler());
		System.out.println("thread name:"+t.getName());
		return t;
	}
}

这里在创建线程时,同样打印出了线程名称。
最后创建线程池,以HandlerThreadFactory作为线程工场,每次创建线程时都会回调newThread方法。

ExecutorService es = Executors.newCachedThreadPool(new HandlerThreadFactory());
es.execute(new ExceptionThread());

执行后输出:

thread name:Thread-0
current thread name:Thread-0
thread name:Thread-0
throwable:java.lang.RuntimeException

当然,也可以不用为每个线程都设置异常处理器,直接设置默认的异常处理器。

Thread.setDefaultUncaughtExceptionHandler(new CustomUncaughtExceptionHandler());
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new ExceptionThread());

默认的异常处理器,只有在不存在专有的UncaughtExceptionHandler时才会被调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值