我正在使用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),即使我可以知道存在计算结果。
答案 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。
如果您进行调试,它将非常清楚。
至于线程继续运行,那是由于执行器。
在显式关闭之前,池中的线程将一直存在。