Java 未来总是返回 null
Java Future always returning null
嘿,我有一个关于 Java 期货的快速问题。我将问题分解为这个片段:
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。我错过了什么?
问题出在 FutureTask
。如果您使用 Callable
或 Runnable
调用您的服务,它会按预期工作并且 returns 结果:
Future<?> result = service.submit(() -> true);
System.out.println(result.get()); // prints true
是 FutureTask
不符合逻辑。
您的 () -> true
是 Callable<Boolean>
returning true
,但 FutureTask
是 Runnable
而不是 return 值。因此 submit
return 是一个 Future<Void>
(因为它得到一个 Runnable
参数,而不是 Callable
),它总是包含 null。
删除不必要的 FutureTask
包装器,直接使用 Callable
。
FutureTask
扩展 Runnable
接口
来自 java 文档 ExecutorService.submit(Runnable)
方法:
Submits a Runnable task for execution and returns a Future
representing that task. The Future's {@code get} method will return
{@code null} upon successful completion.
要获得结果,您可以使用 Callable
:
System.out.println(service.submit(() -> true).get());
或从任务中获取结果:
FutureTask<Boolean> task = new FutureTask<>(() -> true);
service.submit(task);
System.out.println(task.get());
嘿,我有一个关于 Java 期货的快速问题。我将问题分解为这个片段:
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。我错过了什么?
问题出在 FutureTask
。如果您使用 Callable
或 Runnable
调用您的服务,它会按预期工作并且 returns 结果:
Future<?> result = service.submit(() -> true);
System.out.println(result.get()); // prints true
是 FutureTask
不符合逻辑。
您的 () -> true
是 Callable<Boolean>
returning true
,但 FutureTask
是 Runnable
而不是 return 值。因此 submit
return 是一个 Future<Void>
(因为它得到一个 Runnable
参数,而不是 Callable
),它总是包含 null。
删除不必要的 FutureTask
包装器,直接使用 Callable
。
FutureTask
扩展 Runnable
接口
来自 java 文档 ExecutorService.submit(Runnable)
方法:
Submits a Runnable task for execution and returns a Future representing that task. The Future's {@code get} method will return {@code null} upon successful completion.
要获得结果,您可以使用 Callable
:
System.out.println(service.submit(() -> true).get());
或从任务中获取结果:
FutureTask<Boolean> task = new FutureTask<>(() -> true);
service.submit(task);
System.out.println(task.get());