我有这个片段。
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 没有。空在这里代表空