ThreadPoolExecutor を指定して、従来のスレッド プールを Java に置き換えています。従来のスレッド プールでは、起動時に 600 百のスレッドが作成されます。しかし、ThreadPoolExecutor では、コア スレッド、最大スレッド数、および prestartAllCoreThreads() の概念を使用して、起動時のスレッド数を制限できます。
今、
- 実行中のスレッドが corePoolSize よりも少ない場合、Executor はキューに入れるよりも新しいスレッドを追加することを優先します。2 ) corePoolSize 以上のスレッドが実行されている場合、Executor は、新しいスレッドを追加するよりも、要求をキューに入れることを優先します。
- 要求をキューに入れることができない場合、これが maximumPoolSize を超えない限り、新しいスレッドが作成されます。この場合、タスクは拒否されます。
最初のシナリオは問題ありませんが、私が望むのは、コア スレッドが使用されているときに、タスクがキューに入れられ (制限されたキューの場合でも、サイズ 100 など)、コア スレッドがアイドル状態になるかキューがいっぱいになるのを待つことではなく、非コア プール クォータから新しいスレッドが作成されます。リアルタイムのように、私のアプリケーションはタスクがキューで待機しているという考えに耐えられません。
だから私が欲しいのは、CoreThreads -> Non-CoreThreads -> CoreThreads -> Queue -> Non-CoreThreads ではなく、CoreThreads -> Non-CoreThreads -> Queue です。
つまり、コア スレッドが使用されている場合は新しいスレッドを作成し、プール サイズが最大の場合は、タスクをキューに入れ、スレッドが解放されるのを待つ必要があります。
さて、これの 1 つの方法は、ThreadPoolExecutor クラスを拡張して execute メソッドをオーバーライドすることですが、その場合、クラス全体をほぼコピーする必要があります。これは私が考えることができる汚い方法です。誰でも他の方法を提案できますか。
注:スレッド数を制限する必要があるため、cachedThreadPool は使用できません。