【Java】
あらかじめスレッドを作成してスレッドプールに用意しておく方法

ExecutorServiceとScheduledExecutorServiceを使用

投稿日 2022/03/17 更新日 2022/03/17


こんにちは。当サイトの管理者「元木皇天」です。

今回はJavaの並列処理で使用するスレッドをあらかじめ作成して、スレッドプールに用意しておく方法について解説いたします。

環境
OS:MacOS Big Sur
Java:Ver 11
Eclipse:Ver 2021-12

やりたいこと

・スレッドをあらかじめ作成する

・遅延実行可能なスレッドをあらかじめ作成する

参考文献
徹底攻略Java SE 11 Gold問題集[1Z0-816]対応
Java SE11 API Executorsクラス
Java SE11 API ExecutorServiceクラス
Java SE11 API ScheduledThreadPoolExecutorクラス

スレッドをあらかじめ1つ作成する方法

スレッドを作成する方法について、まずは1つだけスレッドを作成してスレッドプールに用意する方法について解説いたします。

1つだけスレッドを作成するには、ExecutorsクラスのnewSingleThreadExecutor()を使用します。

使い方は以下のような感じです。

//スレッドを一つ作成する
ExecutorService exe = Executors.newSingleThreadExecutor();

実際にこのスレッド使用すると以下のようになります。

(以下の例では、作成したスレッドで処理を5回実行しています。出力結果のスレッドIDが全て同じ値であることから、5回とも同じスレッドで処理が実行されたことがわかります。)

newSingleThreadExecutorの使用例

スレッドをあらかじめ複数作成する方法

次はスレッドを複数作成してスレッドプールに用意しておく方法について解説いたします。

スレッドを複数作成する場合は、newFixedThreadPool(x)を使用します(引数のxには作成したいスレッド数を設定します)。


使い方は以下の通りです(例としてスレッドを3つ作成しています)。

//スレッドを3つ作成する
ExecutorService exe = Executors.newFixedThreadPool(3);

スレッドプールに作成した3つのスレッドを使用して、前項と同じ処理を行なった結果が以下になります。

newFixedThreadPoolの使用例

newSingleThreadExecutorを使用した時とは違い、出力されるスレッドIDが異なることから、それぞれ別のスレッドで処理されていることがわかります。

また、スレッドIDが3種類しか出力されていないことから、3つのスレッドが作成されていることもわかります。

遅延実行可能なスレッドをあらかじめ1つ作成する方法

今度は今までとは異なり遅延実行可能なスレッドを作成する方法について解説いたします。

遅延実行や繰り返し実行をするためには、前項で紹介した「ExecutorServiceクラス」ではなく、「ScheduledThreadPoolExecutorクラス」を使用します。


ではまず、ScheduledThreadPoolExecutor用のスレッドを1つ作成する方法について解説いたします。

ScheduledThreadPoolExecutor用のスレッドを1つ作成するにはnewSingleThreadScheduledExecutor()を使用します。

使い方は以下の通りです。

//スレッドを1つ作成する
ExecutorService exe = Executors.newSingleThreadScheduledExecutor();

実行すると以下のような結果になります。

newSingleThreadScheduledExecutorの使用例

処理を実行し、全て同じスレッドIDが出力されていることから、5回とも同じスレッドで処理が実行されたことがわかります。

また、スレッドIDが1種類しか出力されていないことから、作られたスレッドは1つのみということもわかります。

遅延実行可能なスレッドをあらかじめ複数作成する方法

最後に、ScheduledThreadPoolExecutor用のスレッドを複数作成する方法について解説いたします。

ScheduledThreadPoolExecutor用のスレッドを複数作成するにはnewScheduledThreadPool(x)を使用します。(引数xには作成したいスレッドの数を設定します)

使い方は以下のような感じです。(例としてスレッドを3つ作成しています)

//スレッドを3つ作成する
ScheduledExecutorService exe = Executors.newScheduledThreadPool(3);

実行すると以下のような結果になります。

newScheduledThreadPoolの使用例

newFixedThreadPoolを使用した時と同様に、出力されるスレッドIDが異なることから、それぞれ別のスレッドで処理されていることがわかります。

また、スレッドIDが3種類しか出力されていないことから、3つのスレッドが作成されていることもわかります。

まとめ

Javaであらかじめスレッドを作成してスレッドプールに用意しておくには

newSingleThreadExecutor()
newFixedThreadPool()

を使用する。

遅延処理・繰り返し処理用のスレッドをスレッドプールに用意しておくには
newSingleThreadScheduledExecutor()
newScheduledThreadPool
を使用する。

参考文献・おすすめ文献