您如何知道Future对象何时完成其任务?

时间:2019-05-23 19:32:32

标签: java multithreading future callable

我正在使用Java8。我想知道如何知道Future对象何时完成其任务。我尝试通过编写以下内容来了解​​它

    Callable<Long> c = new Callable<Long>() {

        @Override
        public Long call() throws Exception {
            return new Long(factorial(1));
        }

    };

    ExecutorService s = Executors.newFixedThreadPool(2);
    Future<Long> f = s.submit(c);

    while (!f.isDone())
    {
        System.out.println("waiting..." + f.get().toString());
    }   // while
    System.out.println(f.get().toString());

但是while循环永远不会返回(f.isDone()始终为false),即使我可以知道存在计算结果。

2 个答案:

答案 0 :(得分:1)

它可以工作,但是您永远不会关闭已创建的池。您可以在ExecutorService文档中阅读有关此内容的信息。最后添加此内容以关闭您的游泳池:

s.shutdown();
try {
    if(!s.awaitTermination(3, TimeUnit.SECONDS)) {
          s.shutdownNow();
    }
} catch (InterruptedException e) {
    s.shutdownNow();
}

进一步的解释

Future::get是一项阻止操作。在某些情况下,可能永远不会调用您的循环,因为由Future维护的任务可能会在评估循环条件之前完成。但是在大多数情况下,在第一次循环迭代中,您将调用Future::get,这会阻塞操作。然后,您得到结果,并且循环条件再次被评估为false,因为将来完成了。总结-您的循环将被调用0或1次。然后,您必须像我之前写的那样关闭池。

答案 1 :(得分:0)

不。它将很快完成。对于您的情况,您将打印“ waiting ... 1”和1。

如果您进行调试,它将非常清楚。

至于线程继续运行,那是由于执行器。

  

在显式关闭之前,池中的线程将一直存在。