java线程池异常的处理方法

线程池的任务中,会出现一种特殊的异常。在结果上没有输出,但是程序不会抛出报错,这就需要我们对这种异常进行处理。我们先从通过一个实例来分析这种异常的情况,然后为大家带来处理线程池异常的两种方法及代码实例部分。接下来我们看看线程池发生异常的原理和解决办法吧。

1.异常情况

ExecutorServicethreadPool=Executors.newFixedThreadPool(5);
for(inti=0;i<5;i++){
threadPool.submit(()->{
System.out.println("currentthreadname"+Thread.currentThread().getName());
Objectobject=null;
System.out.print("result##"+object.toString());
});
}

虽然没有结果输出,但是没有抛出异常,所以我们无法感知任务出现了异常。

2.异常处理方法

(1)在run方法上增加异常处理

publicclassFutureTask<V>implementsRunnableFuture<V>{

...

publicvoidrun(){
if(state!=NEW||
!UNSAFE.compareAndSwapObject(this,runnerOffset,
null,Thread.currentThread()))
return;
try{
Callable<V>c=callable;
if(c!=null&&state==NEW){
Vresult;
booleanran;
try{
result=c.call();
ran=true;
}catch(Throwableex){
result=null;
ran=false;
setException(ex);
}
if(ran)
set(result);
}
}finally{
//runnermustbenon-nulluntilstateissettledto
//preventconcurrentcallstorun()
runner=null;
//statemustbere-readafternullingrunnertoprevent
//leakedinterrupts
ints=state;
if(s>=INTERRUPTING)
handlePossibleCancellationInterrupt(s);
}
}

publicVget()throwsInterruptedException,ExecutionException{
ints=state;
if(s<=COMPLETING)
s=awaitDone(false,0L);
returnreport(s);
}

privateVreport(ints)throwsExecutionException{
Objectx=outcome;
if(s==NORMAL)
return(V)x;
if(s>=CANCELLED)
thrownewCancellationException();
thrownewExecutionException((Throwable)x);
}

}

(2)使用UncaughtExceptionHandler处理未捕获异常

Threadthread=newThread(()->{
System.err.println(3/2);
System.err.println(3/0);
});
thread.setUncaughtExceptionHandler(newThread.UncaughtExceptionHandler(){
@Override
publicvoiduncaughtException(Threadt,Throwablee){
System.err.println(Thread.currentThread().getName()+"==>"+e.getMessage());
}
});
thread.start();

原文来自:https://www.py.cn

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容