【Java】
作成したスレッドをスレッドプールに保存(キャッシュ)する方法

newCachedThreadPoolの使い方

投稿日 2022/03/22 更新日 2022/08/05


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

過去の記事では、事前に指定した数のスレッドを作成してスレッドプールに用意する方法について紹介しました。

今回は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クラス

キャッシュ可能なスレッドプールを作成する

キャッシュ可能なスレッドプールを作成するには、ExecutorsクラスのnewCachedThreadPool()を使用します。

newCachedThreadPool()で作成したスレッドプールは、必要に応じて新規スレッドを作成し、その時に作成されたスレッドは60秒間スレッドプールに残り続けます(キャッシュされます)。

スレッドプールの作成の仕方は以下の通りです。

//キャッシュ可能なスレッドプールを作成する
ExecutorService exe = Executors.newCachedThreadPool();

作成したスレッドプールを用いて処理を行ったのが以下のコードです。

//キャッシュ可能なスレッドプールを作成する
ExecutorService exe = Executors.newCachedThreadPool();

//処理を実行する
exe.submit(() -> {
    System.out.println("スレッドのID:" + Thread.currentThread().getId());
});

上記の処理を実行した際に新規作成されたスレッドは、処理完了後60秒間スレッドプールに残り続けます。

キャッシュされていることを確認する

使用方法がわかったところで、次は本当に60秒間キャッシュされているのかどうかを確認したいと思います。

確認手順は以下の通りです。


1.キャッシュ可能なスレッドプールを作成する

2.1で作成したスレッドプールで処理を5回実行し、その時のスレッドIDを確認する

3.10秒後にもう一度処理を5回実行し、その時のスレッドIDを確認する

4.70秒後にもう一度処理を5回実行し、その時のスレッドIDを確認する


では、実際に確認してみましょう。

上記の1〜4の手順を実行した結果が以下になります。

キャッシュされていることを確認する1/2 キャッシュされていることを確認する2/2

2回目(10秒後)の処理では、1回目に実行した時と同じスレッドIDが出力されていることから、同じスレッドが使用されていることがわかります(スレッドがキャッシュされていることがわかります)。

しかし、60秒以上経過した3回目では1回目・2回目とは異なるスレッドIDが出力されています。

このことから、1回目の処理で作成した5つのスレッドは60秒後には破棄されてしまったため、3回目の処理ではまた新たに5つのスレッドが作成されたということがわかります。


一応、以下に公式APIの説明を載せておきます。

newCachedThreadPoolのAPI

補足:なぜキャッシュする必要があるのか?

最後に軽く補足説明だけしておきます。

そもそも、なぜ作成したスレッドをキャッシュしておく必要があるのか?

それは、新規にスレッドを作成する処理はCPUにとってとても負荷が高い処理だからです。

そのため、頻繁にスレッドを作成するのであれば毎度スレッドを新規作成するのではなく、一度作成したスレッドを残しておいて再利用する方がより高いパフォーマンスを発揮できます。

まとめ

Javaで、作成したスレッドをスレッドプールに保存(キャッシュ)するには

newCachedThreadPool()

を使用する。

参考文献・おすすめ文献