0

Executors.newFixedThreadPool(100)メソッドを使用しています。1回のコマンド実行には約20スレッドが必要です。コマンドを5〜6回実行すると、アプリケーションは応答を停止します。私のスレッドはCallableを実装しています。

そのスレッドは完了後に終了しないのではないかと思います。また、shutdown()を呼び出してスレッドを終了しました。

get()メソッドを使用してスレッドの結果を取得すると、終了する(つまり、キューから削除される)のか、それともプールがスレッドを格納するために使用するキューにまだ存在するのか、誰か教えてください。

4

4 に答える 4

3

スレッドは終了しません。何が起こるかこれは:

  • すべてのワーカースレッドは入力キューを待機します
  • 1つのスレッドがキューからhead要素をポップします
  • それは実行されますCallable
  • 結果を結果キューにプッシュします
  • 入力キューで新しい要素を待機します

したがって、結果キューがオーバーフローするか、結果キューがCallable返されません。

于 2011-06-06T13:24:19.620 に答える
1
  1. get()を呼び出した後でも、スレッドはまだキューにあります。実際、APIは、スレッドが停止した場合でも、「固定」(プール内のスレッドの数を固定)を維持するためにスレッドを再作成することを保証します。

  2. プール内のスレッドが実際に(待機以外の)何らかのタスクを実行している場合、shutdownを呼び出してもスレッドは終了しないことに注意してください。したがって、たとえば、スレッドが何かを実行している無限ループにある場合、shutdownを呼び出すことは無意味です。

于 2011-06-06T13:21:50.513 に答える
1

get()はブロッキング呼び出しです。つまり、実行中のスレッドがタスクを完了して結果が利用可能になるまで、呼び出し元のスレッドは停止します。

エグゼキュータはキューからタスクを取得してクリーンアップするので、答えは「いいえ」です。「まだキューに残っている」わけではありません。

100スレッドを使用する場合の注意-これは途方もなく多い数です。一般的なマシンでは2〜8を試してください(すべて、I / Oなどの他のものを待機するために費やされる時間によって異なります。タスクのCPUバウンドが多いほど、使用するスレッドは少なくなります。

于 2011-06-06T13:22:29.620 に答える
0

shutdown()を呼び出すと、スレッドプールが新しいタスクを受け入れるのを停止するだけで、すべてのタスクが実行された後にすべてのスレッドを終了できます。

コアはいくつありますか?100個のビジースレッドがあり、4コアとすると、すべてのスレッドで取得できるCPU時間はごくわずかです。

于 2011-06-06T13:23:12.290 に答える