Javadocをよく読む(ThreadPoolExecutor編)

はじめに

間違った使い方してたとかたまにあるので、Javadocしっかり読んでみるシリーズ第2弾です。(第1弾はExecutorインターフェース周り)

今回はThreadPoolExecutor周りを見てみます。

ThreadPoolExecutorとは

プールされた複数のスレッドの1つを使用して送信された各タスクを実行するExecutorServiceです。通常はExecutorsファクトリ・メソッドを使用して構成されます。

ということで、ExecutorServiceの1つで、プールされた複数のスレッドでタスクを実行する機能を持ちます。

ThreadPoolExecutorの作成

幅広いコンテキストで有用であるために、このクラスでは多くの調整可能なパラメータや拡張性フックを提供します。ただしプログラマは、より便利なExecutorsファクトリ・メソッド…使用してください

調整可能なパラメータがたくさんあるけど、通常はExecutorsファクトリを使ってThreadPoolExecutorを作成してくださいとのことです。

では続いてThreadPoolExecutorの作成方法を見ていきます。

Executorsで作成

詳細はこちらJavadoc(Executors)

Executorsには標準的な用途を想定した、いくつかの種類のThreadPoolExecutorのファクトリメソッドが用意されています。以下ファクトリメソッドの一部です。たいていの用途はこちらのメソッドで済みます。

  • newFixedThreadPool (固定サイズのThreadPool)
  • newCachedThreadPool (動的にサイズが変わるThreadPool)
  • newSigleThreadPoolExecutor (単一のワーカー・スレッドを実行するExecutor)
  • newScheduledThreadPool (周期的にコマンドの実行をスケジュールできるThreadPool)

ですが、もう少し細くパラメータを調整してThreadPoolExecutorを作成したいケースもあります。その場合はThreadPoolExecutorのコンストラクタで直接パラメータを指定します。

ThreadPoolExecutorのパラメータで作成

詳細はこちらJavadoc(ThreadPoolExecutor)にありますがコンストラクタで提供されているパラメータで以下が調整出来ます。

  • コアおよび最大プール・サイズ
  • オン・デマンド構築
  • 新しいスレッドの作成
  • キューイングポリシ
  • 拒否されたタスク
  • フック・メソッド
  • キューの保守
  • ファイナライズ

いろいろ調整できますね。ちょっと分量が多いのでここは次節 ThreadPoolExecutorを構成する で細かく見ていきます。

ThreadPoolExecutorを構成する

ThreadPoolExecutorのコンストラクタは以下のようになっています。

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)

上記のパラメータは以下の効果があります。

スレッドの作成と破棄に関するパラメータ

corePoolSize

アイドルであってもプール内に維持されるスレッドの数

maximumPoolSize

プール内で可能なスレッドの最大数

keepAliveTime・unit

スレッドのタイムアウト。タイムアウトを超えてアイドルだったスレッドが終了候補に。
候補スレッドはcorePoolSizeを超えた場合に終了されることがある。

タスクのキューに関するパラメータ

workQueue

タスクが実行されるまで保持するために使用するキュー。任意のBlockingQueueを指定できる。
以下の3種のキューの基本方針に応じて、利用するキューを使い分ける。

  • サイズ制限のないキュー(unbounded queue)を使う
  • サイズ制限のあるキュー(bounded queue)を使う
  • タスクをキューに貯めず、同期的にスレッドに渡す

タスクの飽和に関するパラメータ

handler

スレッドの境界およびキューの容量に達したため、実行がブロックされたときに使用するハンドラ


まとめ

こんな感じでThreadPoolExecutorは用途に応じて柔軟にパラメータを変更できるようになっています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA