我有这个片段。
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
,因此您的 Future
从 submit
方法获取的值将为 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/