8

Java SE 6 ドキュメントの ThreadPoolExecutor クラスには、次のメソッドがあります。

public int getActiveCount()

アクティブにタスクを実行しているスレッドのおおよその数を返します。

ここでおおよそ積極的な実行の意味は何ですか?

への呼び出しの前、最中、および後に、getActiveCount()

  1. タスク実行用にプールからN 個のスレッドが割り当てられており、
  2. これらのN 個のスレッドはいずれも、それ以上のタスク割り当てに使用できません。

によって返される整数はgetActiveCount()正確にN ?

getActiveCount()がこの保証を提供しない場合、この情報をより正確な方法で取得する他の方法はありますか?

SO の以前の質問:

Thread Pool Executor Monitoring RequirementJava のスレッド プールに使用可能なスレッドがあるかどうかを確認する方法を見てきましたが、クエリに答えません。

4

2 に答える 2

10

概算である理由は、計算中に数値が変わる可能性があるためです。あなたはマルチスレッドです。計算が完了する前に、異なる数のスレッドがアクティブになる可能性があります (チェックしたときに非アクティブだったスレッドがアクティブになります)。

「特定の時点」と言うとき...それは実際には何の意味もありません。計算は瞬時ではありません。返される数は、プールの流動的/動的な性質を考えると、考えられる最良の答えです。

プール内のどのスレッドも状態を変更しない間に計算が開始および完了した場合、その数は「正確」ですが、プール内のスレッドが状態を変更するまでのみです。つまり、1ms (以下)。

于 2012-05-09T05:45:59.693 に答える
2

ThreadPoolExecutor の実装には実際には存在しない「プールに再び参加する」という概念を導入することで、混乱を招く可能性があると思います。

各ワーカー スレッドは、タスクを待機し続けます (事実上、ブロッキング キューの一番上に置かれます)。各タスクがそのキューに入ると、そのワーカーは「ロック」され、次にタスク前のハウスキーピングが実行され、次に実際のタスクが実行され、次にタスク後のハウスキーピングが実行され、ワー​​カーが「ロック解除」されます。

activeCount() は、「ロックされた」状態のスレッドの数を示します。これは、activeCount() を呼び出した正確な瞬間に実際に「ハウスキーピング」を行っている可能性があるが、「アクティブ」としてカウントされることを意味することに注意してください。実行しようとしている、現在実行されている、または実行されたばかりのタスクである必要があります。

それが「プールに再び参加する」というあなたの考えと一致するかどうかはわかりません-私が言うように、厳密に言えばThreadPoolExecutorの観点からは存在しないという考えを発明しているようです。

于 2012-05-09T05:49:12.890 に答える