まめぞうの技術メモ

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

Javaのスレッドを多重起動してみる

ちょっと気になったのでやってみました。

Javaのスレッドを多重起動したらちゃんと動くのか。

結論から言うと、ちゃんと動きました。

java_thread_多重起動

Javaのスレッドを多重起動する~概要~

以下の過去記事で使ったコードは、

1. スレッドの呼び出し元

2. 呼び出されるスレッド自体

が書かれていた二段構成でした。

tech.mamezou00000.com

これに、「1. スレッドの呼び出し元」の更に呼び出し元を作ってみて、

0. スレッドの呼び出し元の親

1. スレッドの呼び出し元

2. 呼び出されるスレッド自体

という構成を作って実験してみました。

なんでこんなことをしたかというと、プログラミングをしているとこういうコードを書くこともあるのかな、と思ったからです。

そんな時に、スレッドの多重起動が出来るって分かってれば、余計なところで引っかからないかな~と。

サンプルコード

2. 呼び出されるスレッド自体

これから書くのが一番わかりやすいので、2番から書きます。

Runnableを実装した、一般的なスレッドです。

public class ThreadRun4 implements Runnable{

    int childNo;

    public ThreadRun4(int childNo){
        this.childNo = childNo;
    }


    public void run(){

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

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

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

    }
}

1.スレッドの呼び出し元

次はスレッドの呼び出し元です。

Executorサービスを使って、3つのスレッドを起動します。

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

public class ThreadCall4 implements Runnable{

    int childNo;

    public ThreadCall4(int childNo){
        this.childNo = childNo;
    }

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

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

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

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

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

0.スレッドの呼び出し元の親

これが更に「1.スレッドの呼び出し元」を3回呼びます

public class ThreadCall4Parent {

    public static void main(String[] args){

        // 「スレッドの呼び出し元」を3回生成
        for(int i=0; i<3; i++){
            ThreadCall4 th = new ThreadCall4(i);
            Thread thread = new Thread(th);
            thread.start();

        }
    }
}

実験結果~スレッド多重起動できる~

では実験結果。エラー、例外なく、問題なく動いています。

メッセージは、

親の番号 : メイン or スレッド Count: 子スレッドの起動回数

になっています。

末尾 0 のメッセージが12件出ています。

「1.スレッドの呼び出し元」が合計4件メッセージを出します。

それを「0.スレッドの呼び出し元の親」が3回呼ぶので、3*4=12件となります。

javaのthreadの多重起動の実験結果

ということで、この記事が役に立つ場面はあまりないかもしれませんが、いつか検索で引っかかった人の役に立てばいいな、と思います。