2016-07-20 6 views
-2

ここに私が言及している方法があります。私がサブミットを呼び出すのであれば、Futureのgetメソッドを使用して結果を取得せずにスレッドリークが発生するかどうかを疑問に思っていますその結果が取り出されないために再利用することはできません)、将来のスレッドプール全体のパフォーマンスに影響しますか?ありがとう。submit ExecutorService confusion in Java

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#submit-java.util.concurrent.Callable-

に関して、あなたが知っている必要があり 林

+1

_スレッドプール内のスレッドは、結果が取得されないため再利用できません。ここで考えている動作を説明できますか? –

+1

これは簡単にテストできることです:固定スレッドプールを作成し、スレッド数より多くの要求を送信し、何が起こるかを見てください。 –

+0

@SotiriosDelimanolis、返信と投票をいただきありがとうございます。スレッドプールのサイズが5の場合、結果を取得せずに5つのスレッドを送信すると、6番目のスレッドを送信できるかどうかを確認します。これが問題です。 –

答えて

2

一つはExecutorServiceは、インタフェース、クラスではないので、答えExecutorServiceの異なる実装のために異なる可能性があるということです。

言われているように、ExecutorServiceがあなたが心配しているように振舞うと、ほとんどのアプリケーションでは意味をなさないでしょう。各ワーカースレッドがクライアントに返されたFutureオブジェクトにその結果を格納し、結果を忘れてFutureを忘れて次のタスクに移るのであれば、はるかに意味があります。あなたのコードもFuture、その後、Futureと結果の両方がGCによって収集されるだろう、とそれはそれの終わりだろう忘れた場合、それがどのように実装されるかだ、と

IF。

これは私にとって意味のある実装です。

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/concurrent

私は速いかいま見を取ったが、私は徹底的にそれを勉強する時間がありません:あなたはOpenJDKのプロジェクトでThreadPoolExecutorクラスは、実際のソースコードを調べることによって、それをしない方法を自分で見ることができます。

私は私のコメント(上記)で述べたように、私はテストを書いて、疑問があれば自分自身で見つけます。

+0

Jamesさんに感謝します。メモリのパフォーマンスに影響があるかどうか分かりますか?つまり、結果を取得しないと、メモリが大きくなり、GCがトリガされる可能性があります。 –

+1

@LinMa、タスクによって返された結果を無視しても、メモリ使用量は増加しません。タスクがオブジェクトを作成したときにメモリが割り当てられ、オブジェクトが到達不能になった直後にGCによってリクレイムされます。 (つまり、それを参照する変数がプログラム内にない場合) –

+0

Jamesさんに感謝し、投票して回答を回答としてマークします。私に説明するために忍耐を感謝します。 –