Java ExecutorsService 提交一个 FutureTask 获取 Future 返回 null

标签 java future executorservice java.util.concurrent futuretask

我有这个片段。

    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 Future 变量返回其 get 方法的正确值,但 FutureTask 将其传递给 Executors,f2 返回 null,这是为什么?即使 futureTask 引用也为 get 方法返回正确的值“JOHN”,但这是为什么呢?也许是因为我正在传递 FutureTask?我不明白。

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

最佳答案

当您向 ExecutorService 提交 FutureTask 时,它会被视为 Runnable,因此您的 Futuresubmit 方法获取的值将为 null,因为 Runnable 实例不返回任何结果。

由于 FutureTask 实现了 Runnable 接口(interface),因此 ExecutorService 的该方法称为 submit(Runnable task)因此,您包装在 FutureTask 构造函数中的 Runnable 实际上已提交给 ExecutorService,因此在调用 f2 时您会得到 null .get().

但是,当您在 FutureTask 引用上调用 get() 时,一旦 Runnable完成其执行(当您之前在 ExecutorService 中提交任务时)。

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

 // Returning "JOHN" when the supplied Runnable is completed execution.
 System.out.println("FutureTask Reference Object: "+futureTask.isDone()+" "+futureTask.get());

这是根据docs :

Creates a FutureTask that will, upon running, execute the given Runnable, and arrange that get will return the given result on successful completion.

关于Java ExecutorsService 提交一个 FutureTask 获取 Future 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55773525/

相关文章:

java - 将时间戳添加到 HashMap 帖子。如何?

performance - Scala Futures 有很多内核,速度很慢

c++ - 如何确定 std::future 是否有值?

java - 了解 Java 固定线程池

JAVA:如何在特定时间后停止函数的执行?

java - 如何避免使用递归调用使 executorservice 拥塞/停滞/死锁

java - 是否可以创建嵌套的 LinkedObject [Java]

java - Arquillian 测试中的 Persistence.xml 被覆盖

Java SQL 多对多关系

c# - NHibernate 中的 Future() 是什么意思?