まめぞうの技術メモ

IT関連で勉強したことをメモします

Javaのスレッド作成(Executor Serviceを使った複数スレッド生成)

Thread継承Runnable実装、の2つの記事で、基本的なスレッド作成の方法を書きましたが、今度は沢山のスレッドを一括生成する方法を書きます。

沢山のスレッドを一括生成

沢山のスレッドを作るにはスレッドプールを活用しよう

せっかくスレッドを立ち上げる事ができても、Mainとスレッドの2つの同時並行だけでは処理速度が足らない場合もあります。

そんな時には、スレッドプールを活用して、沢山のスレッドを作成するのがおすすめです。

スレッドプールとは?

沢山のスレッドを管理するための仕組みです。

最初に複数スレッドが使うメモリ領域をまとめて確保することができます。

スレッドは立ち上げ時に、メモリを確保するのに時間がかかるので、スレッド立ち上げを1つずつ行うのは非効率です。

これをスレッドプールがまとめてやってくれます。

他にもスレッドが処理するタスクを一元管理したり、スレッドの使い回しも行うことができます。

複数スレッド起動のサンプルコード

それでは複数スレッド起動を、サンプルコードを通してみていきましょう。

まずは呼び出されるスレッド自体ですが、これはRunnable実装の記事と同じで、メッセージを100回出力し続けるだけの処理です。

1つメッセージを書くと、0.1秒休みます。

ThreadRun3.java

public class ThreadRun3 implements Runnable{
    public void run(){

        // iが100になるまでカウントを繰り返す
        for(int i=0; i<100; i++){

            //カウントを出力
            System.out.println("Thread Count:" + i);

            // スリープ0.1秒待つ
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e){
                e.printStackTrace();
            }
        }

    }
}

次に、呼び出し側のコードです。こちらがポイントで、

Executors.newFixedThreadPool(3);

で、3つのスレッドを作るためのスレッドプールを確保しています。

今回は、「ExecutorService」「Executors」を使っていますので、冒頭部でimportが必要です。

ThreadCall3.java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadCall3 {

    public static void main(String[] args){

        // 3つのスレッドを立ち上げられるスレッドプールを作成
        // ()内の引数がスレッドの数
        ExecutorService ex = Executors.newFixedThreadPool(3);

        // 3つのスレッドを生成
        for(int i=0; i<3; i++) {
            ex.submit(new ThreadRun3());
        }

        // iが100になるまでカウントを繰り返す
        for(int i=0; i<100; i++){

            //カウントを出力
            System.out.println("Main Count:" + i);

            try{
                // スリープ0.1秒待つ
                Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

サンプルコードを動作させてみると、以下のようになります。

Main処理での出力が1行、3つのスレッドで3行のメッセージが出力されていますね。

まとめ

このように、スレッドプールを使って効率的に沢山のスレッドを生成して、高速並列処理を実装することができます。

そもそも1つのスレッドの作り方から学びたい、という方は、以下の2つの記事を参照してくださいね。

tech.mamezou00000.com

tech.mamezou00000.com