首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExecutorsService提交FutureTask get on FutureTask返回为null

ExecutorsService提交FutureTask get on FutureTask返回为null
EN

Stack Overflow用户
提问于 2019-04-20 12:27:34
回答 2查看 1.9K关注 0票数 2

我有这个片段。

代码语言:javascript
复制
    final ExecutorService executor = Executors.newFixedThreadPool(3);
    final Runnable runnable = ()->{System.out.println("Inside runnable run method");};
    final Callable<String>callable = ()->{System.out.println("Inside callable call method");return "callable";};
    final FutureTask<String> futureTask = new FutureTask<>(()->{System.out.println("CallableInFutureTask");},"JOHN");
    final FutureTask f1 = (FutureTask)executor.submit(callable);
    final FutureTask f2 = (FutureTask)executor.submit(futureTask);
    final FutureTask f3 = (FutureTask)executor.submit(runnable);
    System.out.println("f1 = " + f1+" "+f1.isDone()+" "+f1.get());
    System.out.println("FutureTask Reference Object: "+futureTask.isDone()+" "+futureTask.get());
    System.out.println("f2 = "+f2.isDone()+" "+f2.get());
    System.out.println("f3 = " + f3+" "+f3.isDone()+" "+f3.get());        
    executor.shutdown();

f1和f3未来变量正在返回其get方法的正确值,但是FutureTask将其传递给执行者,f2将返回null,这是为什么?即使是futureTask引用也返回了get方法的正确值"JOHN“,但为什么会这样呢?也许是因为我传递了一个FutureTask?我不明白。

我只是认为f2和futureTask引用会返回相同的值。对不起,如果这个问题很简单的话,非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-20 12:50:26

当您向FutureTask提交ExecutorService时,它被视为Runnable,因此您从submit方法获得的Future将具有null值,因为Runnable实例不返回任何结果。

由于FutureTask实现了Runnable接口,所以ExecutorService的这个方法被称为submit(Runnable task),所以在FutureTask构造函数中包装的Runnable实际上是提交给ExecutorService的,因此在调用f2.get()时获得null。

但是,当您在FutureTask引用上调用FutureTask时,一旦Runnable完成了它的执行(当您在ExecutorService中早些时候提交任务时),您将返回作为第二个参数提供的值。

您还可以通过不在futureTask中提交ExecutorService来验证这一点,如果您试图在futureTask变量上调用get,get调用将无限期地阻塞,因为Runnable尚未执行。

代码语言:javascript
复制
 // Returning "JOHN" when the supplied Runnable is completed execution.
 System.out.println("FutureTask Reference Object: "+futureTask.isDone()+" "+futureTask.get());

这是根据文档

创建一个FutureTask,在运行时执行给定的Runnable,并安排get在成功完成时返回给定的结果。

票数 2
EN

Stack Overflow用户

发布于 2019-04-20 12:39:48

它与回报是正确的。f1有一个返回,但f2和f3没有。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55773525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档