Java Future 总是返回 null



嘿,我有一个关于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 上。如果使用 CallableRunnable 调用服务,则按预期工作并返回结果:

Future<?> result = service.submit(() -> true);
System.out.println(result.get()); // prints true

相关内容

  • 没有找到相关文章

最新更新