2017-02-19 14 views
-1

CompletableFutureが完了しなかった場合はどうなりますか?メモリリークの費用はかかりますか?それともスレッドプールからスレッドを使い果たしたのですか?CompletableFutureが完了しなかった場合はどうなりますか?

未完成の未来を清掃するために何ができるのでしょうか?

私は次のような機能を持っていると言うと、タスクを実行している間にプール内のスレッドがリークしたり消費されたりする可能性がありますか?

public void foo() 
{ 
    CompletableFuture.supplyAsync(this::functionNeverComplete, pool) 
     .whenComplete((r,e) -> logger.info("done {}",r,e)); 
} 
+1

なぜ完了しないのですか? – shmosel

+0

私はあなたの混乱を理解していません。 'CompletableFuture'はどのスレッドとも無関係です。他のオブジェクトと同様に動作します。それは到達不能と判断されたときにGC'edされます。 –

+0

'supplyAsync'のjavadocは何を表していますか? –

答えて

0

あなたはどう思いますか?無限ループを実行しているスレッドがある場合は、他には使用されていないスレッドが1つあります。処理を明示的にcancel()しない限り、自動的に処理を停止するものはありません。

質問は次のとおりです。なぜ、無限に長いタスクをCompletableFutureとして実行するのですか?

0

コマンドを実行して結果の出力をキャプチャするために、非常に長いタスクがランタイムを生成していました。スタックされた動作は、生成されたプロセスが孤立していたロック(ロックを所有しているプロセスが終了した)を待機しようとしていることが原因です。

ロックをクリーンにした後、コードが機能し始めます。私は回想して、@ Kayamanが示唆したように、答えは明らかでなければならないと思う。

関連する問題