Java ExecutorsService 提交 FutureTask get on Future 返回 null



我有这个片段。

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 将其传递给执行器,f2 返回 null 为什么会这样?即使是 futureTask 引用也为 get 方法返回正确的值"JOHN",但这是为什么呢?也许是因为我正在传递一个未来任务?我不明白。

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

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

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

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

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

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

这是根据文档

创建一个未来任务,该任务将在运行时执行给定的 可运行,并安排 get 将返回给定的结果 成功完成。

返回是正确的。 F1 有回报,但 F2 和 F3 没有。空在这里代表

相关内容

  • 没有找到相关文章

最新更新