嘿,我有一个关于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"。但相反,它总是输出空值。我错过了什么?
这是抛弃逻辑的FutureTask
。您的() -> true
是一个返回Callable<Boolean>
true
,但FutureTask
是一个不返回值的Runnable
。因此,submit
返回一个Future<Void>
(因为它得到的是一个Runnable
参数,而不是一个Callable
),它总是包含 null。
删除不必要的FutureTask
包装器,直接使用Callable
。
FutureTask
扩展Runnable
接口
来自 java 文档ExecutorService.submit(Runnable)
方法:
提交可运行任务执行并返回未来代表该任务。未来的 {@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());
问题出在FutureTask
上。如果使用 Callable
或 Runnable
调用服务,则按预期工作并返回结果:
Future<?> result = service.submit(() -> true);
System.out.println(result.get()); // prints true