デイブ:
私は、Java 8.私は未来のオブジェクトがそのタスクを完了したときにあなたが言うことができるかと思いまして使用しています。私は以下を書き込むことによって、それを理解しようとしました
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です)。
michalk:
しかし、あなたが作成したので、プールをシャットダウンすることはありません動作します。あなたにはこのことについて読むことができるExecutorServiceののドキュメント。あなたのプールを閉鎖する最後にこれを追加します。
s.shutdown();
try {
if(!s.awaitTermination(3, TimeUnit.SECONDS)) {
s.shutdownNow();
}
} catch (InterruptedException e) {
s.shutdownNow();
}
さらなる説明:
Future::get
ブロック操作です。ループ条件が評価される前に、将来のことで維持されたタスクが完了することができるので、いくつかの状況下では、あなたのループが呼び出されることはありません可能性があります。しかし、最初のループ反復でほとんどの場合、あなたが呼ぶFuture::get
操作をブロックしています。その後、結果を取得し、将来が行われるため、再度、ループ条件がfalseに評価されます。結論するには-あなたのループは0または1回呼び出されます。その後、あなたは、私が以前に書いたようにプールを閉鎖しなければなりません。