java学习-【转】java UncaughtExceptionHandler 处理线程意外中止

   Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。  


      JDK5.0之前,不能为单独的Thread设置UncaughtExceptionHandler,也不能指定一个默认的UncaughtExceptionHandler。为了可以设置一个UncaughtExceptionHandler,需要去继承ThreadGroup并覆写uncaughtException方法。 

      在JDK5.0中,我们通过Thread的实例方法setUncaughtExceptionHandler,可以为任何一个Thread设置一个UncaughtExceptionHandler。当然你也可以为所有Thread设置一个默认的UncaughtExceptionHandler,通过调用Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法,这是Thread的一个static方法。 

      定义一个Handler类必须实现Thread.UncaughtExceptionHandler接口的void uncaughtException(Thread t, Throwable e)方法。如果不设置一个Handler,那么单个Thread的Handler是null。但是,如果这个单个线程是ThreadGroup中的一个Thread,那么这个线程将使用ThreadGroup的UncaughtExceptionHandler。ThreadGroup自身已经实现了Thread.UncaughtExceptionHandler接口。 

 

      uncaughtException(Thread a, Throwable e)可以拿到Thread,所以在uncaughtException释放相关资源是最好的办法。

      总之,JDK5.0中Thread及其相关的辅助功能得到了加强,为我们提供了很多便利和安全的解决方案:) 

****************************原文结束,学习笔记开始*******************************


写个demo测试下用法,代码如下:

import java.util.Random;


public class Treadtest extends Thread{

class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {

 public void uncaughtException(Thread t, Throwable e) {

   System.out.println(t.getName());

   System.out.println("*****************");

 }

}

public void run() {

Random ran = new Random();

while(true){

int num= ran.nextInt(10); //产生随机数,为0的时候抛出异常

System.out.println("num:"+num);

System.out.println("res:"+1/num);

}

}


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

try{

Treadtest t = new Treadtest();

t.setDefaultUncaughtExceptionHandler(t.new MyUncaughtExceptionHandler());

t.start();

} catch (Exception e) {

   e.printStackTrace();

 }

}

}

运行结果见截图:

java学习-【转】java UncaughtExceptionHandler 处理线程意外中止_第1张图片

 

你可能感兴趣的:(java学习-【转】java UncaughtExceptionHandler 处理线程意外中止)