从线程中逃逸的异常

转自 http://blog.csdn.net/yangnianbing110/article/details/7339519

如果使用常规的try...catch来对从线程中抛出的异常进行处理

  1. package Exception;  
  2.   
  3. public class ExceptionThread extends Thread  
  4. {  
  5.     public void run()  
  6.     {  
  7.         throw new RuntimeException();  
  8.     }  
  9.       
  10.     public static void main(String[] args)  
  11.     {  
  12.         ExceptionThread thread = new ExceptionThread();  
  13.         try  
  14.         {  
  15.             thread.start();  
  16.         }  
  17.         catch (RuntimeException e)   
  18.         {  
  19.             System.out.println("handler the exception");  
  20.         }  
  21.     }  
  22. }  

运行上面代码会得到java.lang.RuntimeException的提示,所以可以看见使用try..catch无法捕获从线程中抛出的异常。

怎么处理从线程中抛出的异常呢?这里需要了解Thread类中的一个嵌套类Thread.UncaughtExceptionHandler,根据名字就可以看到是对Thread类中未捕获异常进行处理的类。

[java] view plaincopy
 
  1. api中的解释  
  2.   
  3. public static interface Thread.UncaughtExceptionHandler当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。   
  4. 当某一线程因未捕获的异常而即将终止时,Java 虚拟机将使用 Thread.getUncaughtExceptionHandler() 查询该线程以获得其 UncaughtExceptionHandler 的线程,并调用处理程序的 uncaughtException 方法,将线程和异常作为参数传递。如果某一线程没有明确设置其 UncaughtExceptionHandler,则将它的 ThreadGroup 对象作为其 UncaughtExceptionHandler。如果 ThreadGroup 对象对处理异常没有什么特殊要求,那么它可以将调用转发给默认的未捕获异常处理程序。   

 

[java] view plaincopy
 
  1. public class CatchThreadException  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         ExecutorService exec = Executors.newCachedThreadPool(new HandlerThreadFacotry());  
  6.         exec.execute(new ThreadException());  
  7.     }  
  8. }  
  9.   
  10. class ThreadException implements Runnable  
  11. {  
  12.     public void run()  
  13.     {  
  14.         throw new RuntimeException();  
  15.     }  
  16. }  
  17.   
  18. class MyThreadExceptionHandler implements UncaughtExceptionHandler  
  19. {  
  20.     public void uncaughtException(Thread t, Throwable e)  
  21.     {  
  22.         System.out.println("Exception handler");  
  23.     }  
  24.   
  25. }  
  26.   
  27. class  HandlerThreadFacotry implements ThreadFactory  
  28. {  
  29.       
  30.     public Thread newThread(Runnable r)  
  31.     {  
  32.         Thread thread = new Thread(r);  
  33.         thread.setUncaughtExceptionHandler(new MyThreadExceptionHandler());  
  34.         return thread;  
  35.     }  
  36. }  

运行上面代码得到的结果是Exception handler

ThreadException是一个实现Runnable接口的类,在其run方法中抛出一个异常,

  1. Executors.newCachedThreadPool(new HandlerThreadFacotry())  

我们实现一个线程池,并且指定产生线程的工厂方法,在该工厂方法里面,我们每生产一个线程就调用Thread.setUncaughtExceptionHandler()为其指定异常处理handler,当线程抛出异常的时候,就会执行指定handler的uncaughtException()方法,参数由jdk自动传入。

posted @ 2014-10-05 01:38  princessd8251  阅读(284)  评论(0)    收藏  举报