7. java.util.concurrentパッケージ
2005.11.16 株式会社四次元データ 宮澤了祐
- 7.1. Executor
- 7.2. ExecutorService
- 7.3. スレッドプール
JDK5.0で新たにjava.util.concurrentパッケージが追加されました。 マルチスレッドでの処理に対して有用なクラスが含まれています。
7.1. Executor
非同期で行いたい処理がいくつかあるとします。 それらを全て実行するために、一つの処理(=「タスク」、以下タスクと表記します)に対して一つのスレッドを作成していては、 リソースを多く消費することになります。
そのため、既に起動されているスレッドを再利用する等の対策を取ることが考えられます。 JDK5.0からExecutorという概念を取り入れることにより、スレッドの再利用やスケジューリングなど、並列処理を簡単に実現できるようになりました。
ExecutorはRunnableを引数に持つexecute()メソッドを持つインタフェースです。
以下のように使用します。
Executor ex = Executors.newSingleThreadExecutor(); Runnable r1 = .... Runnable r2 = .... ex.execute(r1); ex.execute(r2);
java.util.concurrent.Executorsクラスは、Executorインタフェースなどの実装インスタンスを返す、メソッドを提供するユーティリティクラスです。
Executors.newSingleExecutor()メソッドにより、一つのスレッドでタスクを処理するExecutorを取得します。 Executorのexecute()メソッドでRunnableを実装したタスクを送信することにより、タスクを実行することが出来ます。
今までは、このような一つのスレッドで複数のタスクを処理するためには、もっと煩雑なコードになってしまいましたが、 Executorによってタスクの実行部分が分離されることで、利用者はタスクの内容と処理の順番を考慮する必要がなくなりました。
Executorsに定義されている実装インスタンスを返すメソッドは、newSingleThread()メソッドを含め次のものがあります。
- newSingleThreadExecutor()
一つのスレッドでタスクの処理を行います。 - newFixedThreadPool()
指定した数のスレッドを作成し、タスクの処理を行います。 - newCachedThreadPool()
必要に応じて自動的にスレッドを作成し、タスクの処理を行います。
次の項でそれらの利用法を解説します。