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。如果您使用 CallableRunnable 调用您的服务,它会按预期工作并且 returns 结果:

Future<?> result = service.submit(() -> true);

System.out.println(result.get()); // prints true

FutureTask 不符合逻辑。 您的 () -> trueCallable<Boolean> returning true,但 FutureTaskRunnable 而不是 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());