0

ワーカー スレッドに FixedThreadPool を使用しています。作成方法は次のとおりです。

ThreadPoolExecutor producerThreadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(25);

そのため、サイズを 25 に設定しました。アクティブなスレッドは常に最大 25 にすべきだと思いますか? (私が間違っている場合は修正してください)。

次に、スレッド プールにアイドル状態のスレッドがある場合、メイン スレッドは一度に 30 個のワーカー スレッドを送信しようと常に試みます。

if(producerThreadPool.getActiveCount() <= 25)

しかし、デバッグすると、次のログが得られました。

Mon Jul 23 14:04:42 EDT 2012: {"queued_count":"0","active_count":"28","scheduled_tasks":"28","core_pool_size":"1000","pool_size":"29"}
Mon Jul 23 14:04:43 EDT 2012: {"queued_count":"0","active_count":"3","scheduled_tasks":"33","core_pool_size":"1000","pool_size":"34"}
Mon Jul 23 14:04:44 EDT 2012: {"queued_count":"0","active_count":"0","scheduled_tasks":"60","core_pool_size":"1000","pool_size":"60"}
Mon Jul 23 14:04:45 EDT 2012: {"queued_count":"0","active_count":"0","scheduled_tasks":"90","core_pool_size":"1000","pool_size":"90"}
...

キューは常に空で、core_pool_size は 1000 のままで、pool_size は 1000 まで増加し続けますが、core_pool_size は 25 で、キューに入れられたタスクがあるはずだと思いますか?

私は何か間違ったことをしたか、これを誤解しましたか?

どんな助けでも大歓迎です、ありがとう!

これは私がログを生成した方法です:

HashMap<String, String> log = new HashMap<String, String>();
log.put("core_pool_size", Integer.toString(producerThreadPool.getCorePoolSize()));
log.put("scheduled_tasks", Long.toString(producerThreadPool.getTaskCount()));
log.put("pool_size", Integer.toString(producerThreadPool.getPoolSize()));
log.put("active_count", Integer.toString(producerThreadPool.getActiveCount()));
log.put("queued_count", Integer.toString(producerThreadPool.getQueue().size()));
String gson_str = gson.toJson(log);
4

1 に答える 1

2

ドキュメントThreadPoolExecutor.getActiveCount()によると、正確な値を取得するために必要なオーバーヘッドを考慮すると、おおよそのカウントしか得られません。したがって、「28」と表示されている場合、実際には 28 のスレッドが同時に実行されているわけではありませんが、関数呼び出しの期間中は 28 のスレッドがカウントされています。

于 2012-07-23T18:30:53.063 に答える