ワーカー スレッドに 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);