Java Future总是返回null

时间:2017-01-19 15:35:43

标签: java null future

嘿,我得到了一个关于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。我错过了什么?

3 个答案:

答案 0 :(得分:3)

FutureTask正在抛弃逻辑。 您的() -> trueCallable<Boolean>返回true,但FutureTaskRunnable,不会返回值。因此,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。如果您使用CallableRunnable来呼叫您的服务,它会按预期工作并返回结果:

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

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