`

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

 
阅读更多

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

捕获线程异常

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时才会被调用。

分享到:
评论

相关推荐

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │ 高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │ 高并发编程第一阶段34讲、ThreadGroup API介绍之二.mp4 │ 高并发编程第一阶段35讲、...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │ 高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │ 高并发编程第一阶段34讲、ThreadGroup API介绍之二.mp4 │ 高并发编程第一阶段35讲、...

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     15.3.3 多进程的并发服务器和多线程的并发服务器  15.3.4 客户端进程的多线程化  本章小结 第十六章 网络售票系统的简单模拟  16.1 系统的总体设计  16.1.1 应用的说明  16.1.2 数据格式的...

    Eclipse权威开发指南2.pdf

    5.3.5 版本设置:捕获资源的当前状态..... 135 5.3.6 分支和合并:支持并行开发..... 135 5.3.7 在分支和合并时对于修订版本号发生了什么..... 136 5.3.8 使用CVS管理二进制文件..... 136 5.4 Eclipse中的CVS...

    Eclipse权威开发指南3.pdf

    5.3.5 版本设置:捕获资源的当前状态..... 135 5.3.6 分支和合并:支持并行开发..... 135 5.3.7 在分支和合并时对于修订版本号发生了什么..... 136 5.3.8 使用CVS管理二进制文件..... 136 5.4 Eclipse...

    Eclipse权威开发指南1.pdf

    5.3.5 版本设置:捕获资源的当前状态..... 135 5.3.6 分支和合并:支持并行开发..... 135 5.3.7 在分支和合并时对于修订版本号发生了什么..... 136 5.3.8 使用CVS管理二进制文件..... 136 5.4 Eclipse...

Global site tag (gtag.js) - Google Analytics