Java ExecutorsService提交FutureTask get on Future返回null

问题描述 投票:2回答:2

我有这个片段。

    final ExecutorService executor = Executors.newFixedThreadPool(3);
    final Runnable runnable = ()->{System.out.println("Inside runnable run method");};
    final Callable<String>callable = ()->{System.out.println("Inside callable call method");return "callable";};
    final FutureTask<String> futureTask = new FutureTask<>(()->{System.out.println("CallableInFutureTask");},"JOHN");
    final FutureTask f1 = (FutureTask)executor.submit(callable);
    final FutureTask f2 = (FutureTask)executor.submit(futureTask);
    final FutureTask f3 = (FutureTask)executor.submit(runnable);
    System.out.println("f1 = " + f1+" "+f1.isDone()+" "+f1.get());
    System.out.println("FutureTask Reference Object: "+futureTask.isDone()+" "+futureTask.get());
    System.out.println("f2 = "+f2.isDone()+" "+f2.get());
    System.out.println("f3 = " + f3+" "+f3.isDone()+" "+f3.get());        
    executor.shutdown();

f1和f3 Future变量返回其get方法的正确值,但FutureTask将它传递给Executors,f2返回null为什么会这样?即使futureTask引用返回get方法的正确值“JOHN”,但为什么会这样?也许是因为我正在通过FutureTask?我不懂。

我只是认为f2和futureTask引用会返回相同的值。对不起,如果这个问题很简单,非常感谢。

java future executorservice java.util.concurrent futuretask
2个回答
2
投票

当你向FutureTask提交ExecutorService时,它被视为Runnable,因此你从Future方法获得的submit将具有值null,因为Runnable实例不会返回任何结果。

由于FutureTask实现Runnable接口,ExecutorService的这种方法被称为submit(Runnable task)所以你在Runnable构造函数中包装的FutureTask实际上被提交给ExecutorService,因此你在f2.get()的调用中得到null。

但是当您在get()引用上调用FutureTask时,一旦Runnable完成执行(当您在ExecutorService中提交任务时),您将获得作为第二个参数提供的值。

您也可以通过不在futureTask中提交ExecutorService来验证这一点,然后如果您尝试调用futureTask变量,则get调用将无限期地阻塞,因为Runnable尚未执行。

 // Returning "JOHN" when the supplied Runnable is completed execution.
 System.out.println("FutureTask Reference Object: "+futureTask.isDone()+" "+futureTask.get());

这是根据docs

创建一个FutureTask,在运行时执行给定的Runnable,并安排get将在成功完成时返回给定的结果。


1
投票

回报是正确的。 f1有一个返回,但f2和f3没有。 null代表虚空

© www.soinside.com 2019 - 2024. All rights reserved.