UncaughtExceptionHandler
UncaughtExceptionHandler使用场景
Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使使用try…catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等
Thread类源代码
// null unless explicitly set
private volatile UncaughtExceptionHandler uncaughtExceptionHandler;
// null unless explicitly set
private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler;
可以看到这2个变量,需要注意到区别,defaultUncaughtExceptionHandler是静态的,我们可以调用此方法设置所有线程对象的异常处理器,而uncaughtExceptionHandler则是针对单个线程对象的异常处理器。
但是uncaughtExceptionHandler优先级高于defaultUncaughtExceptionHandler。
UncaughtExceptionHandler使用代码
首选需要写一个去实现UncaughtExceptionHandler
public class UncaughtExceptionHandlerDemo extends Throwable implements Thread.UncaughtExceptionHandler{
public UncaughtExceptionHandlerDemo() {
}
@Override
public void uncaughtException(Thread t, Throwable e) {
Logger logger = Logger.getAnonymousLogger();
logger.log(Level.WARNING,"线程异常"+t.getName()+"被终止了");
System.out.println("异常:"+e);
}
}
然后在需要得地方去设置uncaughtExceptionHandler,把子线程得异常捕获到,输出到日志里
lock.lock();
Boolean falg=false;
String massage="";
try{
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandlerDemo());
if(numVo!=null){
falg= functionInterfaceStrategyImpl.doOperation(numVo,numVo.getOperationType());
}else{
falg= functionInterfaceStrategyImpl.doOperation(paunv,paunv.getOperationType());
}
}catch (Exception e){
log.info(e.getMessage());
massage=e.getMessage();
}finally{
lock.unlock();
}