源代码分析为什么ThreadPoolExecutor的submit方法不会把运行时异常不会交给UncaughtExceptionHandler处理
版本:jdk1.6
submit在父类AbstractExecutorService中,所以分析AbstractExecutorService
AbstractExecutorService
public <T> Future<T> submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}
分析 RunnableFuture<T> ftask = newTaskFor(task, result);
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new FutureTask<T>(runnable, value);
}
public FutureTask(Runnable runnable, V result) {
sync = new Sync(Executors.callable(runnable, result));
}
Executors.callable(runnable, result)
public static <T> Callable<T> callable(Runnable task, T result) {
if (task == null)
throw new NullPointerException();
return new RunnableAdapter<T>(task, result);
}
RunnableAdapter<T>(task, result);
public T call() {
task.run();
return result;
}
分析结果 :Executors.callable没有对run的运行异常处理
|
继续分析 FutureTask.run(),注意callable
sync.innerRun();
sync. innerRun
void innerRun() {
if (!compareAndSetState(0, RUNNING))
return;
try {
runner = Thread.currentThread();
if (getState() == RUNNING) // recheck after setting thread
innerSet(callable.call());
else
releaseShared(0); // cancel
} catch (Throwable ex) {
innerSetException(ex);
}
}
这里通过Throwable可以捕捉运行时异常,分析 innerSetException(ex);
void innerSetException(Throwable t) {
for (;;) {
int s = getState();
if (s == RAN)
return;
if (s == CANCELLED) {
// aggressively release to set runner to null,
// in case we are racing with a cancel request
// that will try to interrupt runner
releaseShared(0);
return;
}
if (compareAndSetState(s, RAN)) {
exception = t;
result = null;
releaseShared(0);
done();
return;
}
}
}
这里没有把t再抛出
所以用submit提交的任务,万一抛出运行时异常,也被程序处理了,不会抛给jvm了,所以不会交给UncaughtExceptionHandler处理
那么,如何处理任务抛出运行时异常后,需要一些资源关闭、异常日志记录等问题呢,只能用重写afterExecute(Runnable r ,Throwable ex) 方法了
总结:使用submit提交任务时 ,会把原始任务包裹成FutureTask,FutureTask中的run方法捕捉到了运行时异常处理并没有再抛出
相关推荐
线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor...
主要介绍了解决python ThreadPoolExecutor 线程池中的异常捕获问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
在《阿里巴巴java开发手册》中...另外由于前面几种方法内部也是通过ThreadPoolExecutor方式实现,使用ThreadPoolExecutor有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。
ThreadPoolExecutor源码解析.md
下面小编就为大家带来一篇简单谈谈ThreadPoolExecutor线程池之submit方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
线程池ThreadPoolExecutor底层原理源码分析
ThreadPoolExecutor源码解析.pdf
ThreadPoolExecutor使用和思考
ThreadPoolExecutor线程池,有详尽介绍,本人进行过测试,可以使用
主要介绍了java ThreadPoolExecutor使用方法简单介绍的相关资料,需要的朋友可以参考下
线程池的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,那么超出数量的线程排队等候,等其他线程执行完毕再从队列中取出任务来执行。...
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long
(转)线程池:java_util_ThreadPoolExecutor 比较详细的介绍了ThreadPoolExecutor用法与属性
1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用线程池ThreadPoolExecutor解决了ping多个IP多任务耗时问题。...
引子 线程的创建和销毁比较消耗资源,... Future submit(Callable task):执行任务,有返回值,一般又来执行Callable void shutdown() :关闭线程池 AbstractExecutorService:基本实现了ExecutorService的所有方法 Th
Java,线程池,ThreadPoolExecutor
一个关于java 线程池的例子,也适合android
线程池ThreadPoolExecutor实战及其原理分析(上)
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...