一种使用线程池submit提交任务获取不到结果的情况

一种使用线程池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中入参为Runnablesubmit重载方法中,就相当于使用excute提交Runnable任务一样,既然是runnable,它不带返回值,自然也就无法获取返回结果。


3、正确写法

既然知道错误原因,那正确的写法也就呼之欲出,直接使用Callable传递就好。

Future<String> submit1 = threadPoolTaskExecutor.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        return mockMethod("Thread-No.2-");
    }
});
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值