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

How can you tell when a Future object is done with its task?

我正在使用 Java 8. 我想知道如何判断 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 循环从不 returns(f.isDone() 总是错误的),即使我可以告诉有一个计算结果。

它可以工作,但是您永远不会关闭您创建的池。您可以在 ExecutorService 文档中阅读相关内容。在最后添加这个以关闭你的池:

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

进一步说明 :

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

没有。很快就会完成。在您的情况下,您将打印 "waiting... 1 " 和 1.

调试一下就清楚多了

至于线程保持运行,那是因为Executors。

The threads in the pool will exist until it is explicitly shutdown.