原先多线程并发编程的学习笔记和代码整理一下贴上来。
---------------------------------
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时才会被调用。
相关推荐
│ 高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │ 高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │ 高并发编程第一阶段34讲、ThreadGroup API介绍之二.mp4 │ 高并发编程第一阶段35讲、...
│ 高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │ 高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │ 高并发编程第一阶段34讲、ThreadGroup API介绍之二.mp4 │ 高并发编程第一阶段35讲、...
15.3.3 多进程的并发服务器和多线程的并发服务器 15.3.4 客户端进程的多线程化 本章小结 第十六章 网络售票系统的简单模拟 16.1 系统的总体设计 16.1.1 应用的说明 16.1.2 数据格式的...
5.3.5 版本设置:捕获资源的当前状态..... 135 5.3.6 分支和合并:支持并行开发..... 135 5.3.7 在分支和合并时对于修订版本号发生了什么..... 136 5.3.8 使用CVS管理二进制文件..... 136 5.4 Eclipse中的CVS...
5.3.5 版本设置:捕获资源的当前状态..... 135 5.3.6 分支和合并:支持并行开发..... 135 5.3.7 在分支和合并时对于修订版本号发生了什么..... 136 5.3.8 使用CVS管理二进制文件..... 136 5.4 Eclipse...
5.3.5 版本设置:捕获资源的当前状态..... 135 5.3.6 分支和合并:支持并行开发..... 135 5.3.7 在分支和合并时对于修订版本号发生了什么..... 136 5.3.8 使用CVS管理二进制文件..... 136 5.4 Eclipse...