嘿,我得到了一个关于Java Futures的快速问题。我把问题分解为这个片段:
ExecutorService service = Executors.newCachedThreadPool();
try {
System.out.println(service.submit(new FutureTask<>(() -> true)).get());
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (ExecutionException e1) {
e1.printStackTrace();
}
我希望这在我的终端上输出“true”。但相反,它总是输出null。我错过了什么?
答案 0 :(得分:3)
FutureTask
正在抛弃逻辑。
您的() -> true
是Callable<Boolean>
返回true
,但FutureTask
是Runnable
,不会返回值。因此,submit
会返回Future<Void>
(因为它获取Runnable
参数,而不是Callable
),它始终包含空值。
删除不必要的FutureTask
包装,然后直接使用Callable
。
答案 1 :(得分:2)
FutureTask
扩展了Runnable
界面
为ExecutorService.submit(Runnable)
方法形成java文档:
提交Runnable任务以执行并返回Future 代表那个任务。 Future&#39; @code get}方法将返回 成功完成后{@code null}。
要获得结果,您可以使用Callable
:
System.out.println(service.submit(() -> true).get());
或从任务中获得结果:
FutureTask<Boolean> task = new FutureTask<>(() -> true);
service.submit(task);
System.out.println(task.get());
答案 2 :(得分:0)
问题在于FutureTask
。如果您使用Callable
或Runnable
来呼叫您的服务,它会按预期工作并返回结果:
Future<?> result = service.submit(() -> true);
System.out.println(result.get()); // prints true