一种使用线程池submit任务后无法获取本该有的值的情况
1、问题描述
先上一个代码片段,其中mockMethod
方法为模拟业务处理的方法,可不关注。
Future<?> submit = threadPoolTaskExecutor.submit(new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
return mockMethod("Thread-No.3-");
}
}));
乍一看是不是没啥问题,但是这个代码后面submit.get()
的时候,是没有办法获取返回值的,是一个null
.
2、问题分析以及结论
这个问题其实debug一下,跟踪一下代码就会发现,他其实走的是下面这个接口。
public Future<?> submit(Runnable task) {
ThreadPoolExecutor executor = this.getThreadPoolExecutor();
try {
return executor.submit(task);
} catch (RejectedExecutionException var4) {
throw new TaskRejectedException("Executor [" + executor + "] did not accept task: " + task, var4);
}
}
看到入参,Runnable
, 相信小伙伴们就能知道怎么回事了吧。
使用1问题描述中的写法,其实是走到了2中入参为Runnable
的submit
重载方法中,就相当于使用excute
提交Runnable
任务一样,既然是runnable
,它不带返回值,自然也就无法获取返回结果。
3、正确写法
既然知道错误原因,那正确的写法也就呼之欲出,直接使用Callable传递就好。
Future<String> submit1 = threadPoolTaskExecutor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return mockMethod("Thread-No.2-");
}
});