一、线程的异常(续)
在上一篇博文中我们提到了Thread.UncaughtExceptionHandler接口,我们在日常的编写中可以通过实现这一接口来给每一个Thread对象都附着一个异常处理器,方便异常的监视。
下面的这个例子便是如何创建异常处理器并将其附着到Thread对象上的。(该例子思路来自于Java编程思想(第四版))。
1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 import java.util.concurrent.ThreadFactory; 4 //定义任务 5 class ExceptionTask implements Runnable { 6 @Override 7 public void run() { 8 Thread thread = Thread.currentThread(); 9 System.out.println("号外号外!自定义的ExceptionTask任务正在运行"); 10 System.out.println("当前运行线程中绑定的异常处理器是:" + thread.getUncaughtExceptionHandler()); 11 throw new RuntimeException(); 12 } 13 } 14 //定义自定义的异常处理器 15 class NewUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { 16 public void uncaughtException(Thread thread, Throwable e) { 17 System.out.println("捕捉到了一个RuntimeException异常哟!"); 18 19 } 20 } 21 //定义自定义的线程工厂 22 class MyThreadFactory implements ThreadFactory { 23 @Override 24 public Thread newThread(Runnable task) { 25 System.out.println("现在我们自己的MyThreadFactory要创建一个新的线程啦!"); 26 Thread thread = new Thread(task); 27 System.out.println("名字为" + thread + "的线程被创建好啦!"); 28 thread.setUncaughtExceptionHandler(new NewUncaughtExceptionHandler()); 29 return thread; 30 } 31 } 32 public class ExceptionTest { 33 public static void main(String args[]) { 34 ExecutorService exec = Executors.newCachedThreadPool(new MyThreadFactory()); 35 exec.execute(new ExceptionTask()); 36 } 37 } 38 /*Sample Output: 39 现在我们自己的MyThreadFactory要创建一个新的线程啦! 40 名字为Thread[Thread-0,5,main]的线程被创建好啦! 41 号外号外!自定义的ExceptionTask任务正在运行 42 当前运行线程中绑定的异常处理器是:thread.NewUncaughtExceptionHandler@64acfc45 43 现在我们自己的MyThreadFactory要创建一个新的线程啦! 44 名字为Thread[Thread-1,5,main]的线程被创建好啦! 45 捕捉到了一个RuntimeException异常哟! 46 47 48 49 */
下面对这一例子进行解释。
(1) 类的定义与目的
ExceptionTask类:该类用于定义任务,由于线程的任务便是驱动任务,所以任务是多线程编程的一个核心。
MyThreadFactory类:该类顾名思义,是创建线程的工厂。Java中给我们提供了ThreadFactory接口用于创造线程,故我们在自己的程序中设计驱动任务的线程时,可以实现这一接口,扩展定义属于自己的线程工厂。
NewUncaughtExceptionTask类:该类实现了我们前文中出现了多次的Thread.UncaughtExceptionHandler接口,我们可以通过这种形式来设置属于自己的异常处理器,从而方便我们在程序测试或者Debug的时候更容易的找到问题所在。
ExceptionTest类,就是我们这个样例的主类啦。在主方法中,我们按照前两篇文介绍过的方法创建线程池、线程,然后将定义好的任务放到线程池里。这一个案例就完成了。
(2) 样例的设计思想
此样例的思想来自于Java编程思想。设计思想便是创建线程工厂、任务以及我们心学习的异常处理器。然后根据并发编程的基本步骤(即定义任务、定义线程、将异常处理器绑定到线程以及驱动任务)来驱动我们定义的任务。