ThreadPoolExecutor は、タスク(task)を実行するためのサービス(ExecutorService)です。通常、タスクはスレッドプール内のスレッドで実行されます。
ThreadPoolExecutor は、異なるスレッドプールを使用することができます。異なる作成方法を使用しています:Executors.new****ThreadPool()
- newCachedThreadPool:制限なしで、毎回新しいスレッドが作成されます。
- newFixedThreadPool:固定されたスレッドサイズです。
- newSingleThreadExecutor:単一スレッドのスレッドプールです。
コア / 最大プールサイズ#
新しいタスクが提出されると(execute(runnable)
)、MaximumPoolSize
とCorePoolSize
の 2 つのパラメータの設定に基づいてタスクの宛先が決定されます。
実行中のスレッド数がCorePoolSize
よりも大きく、MaximunPoolSize
よりも小さく、かつ現在の待ち行列がいっぱいの場合、スレッドが作成されます。
つまり、これらの 2 つのパラメータを同じ値に設定すると、FixedThreadPool が作成されます。MaximumPoolSize
を非常に大きな値に設定すると、CachedThreadPool が作成されます。
Keep-alive 時間#
スレッドの生存時間であり、スレッドが作業をしていない場合、この時間が経過するとリリースされます。ゼロにすることはできません。
拒否ポリシー#
コアプールサイズと最大プールサイズ、およびキューがすべて満杯の場合、新しく追加されたタスクを処理する必要があります。いくつかの処理方法があります。
execute()
のスレッドでタスクを直接実行する。RejectedExecutionException
をスローする。- このタスクを破棄する。
- 最も古い(キューの先頭)スレッドを破棄する。
これらは提供される方法であり、RejectedExecutionHandler
インターフェースを自分で実装することもできます。
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
}
}
状態の変化#
ライフサイクル全体で、Running、Stop、Shutdown、Tiddying、Terminated の間で変換が行われます。
内部クラス#
worker#
タスクを実行するためのものです。Service のprivate boolean addWorker(Runnable firstTask, boolean core)
は、状態に基づいて worker を作成し、実行します。