ちょっと気になったのでやってみました。
Javaのスレッドを多重起動したらちゃんと動くのか。
結論から言うと、ちゃんと動きました。
Javaのスレッドを多重起動する~概要~
以下の過去記事で使ったコードは、
1. スレッドの呼び出し元
2. 呼び出されるスレッド自体
が書かれていた二段構成でした。
これに、「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件となります。
ということで、この記事が役に立つ場面はあまりないかもしれませんが、いつか検索で引っかかった人の役に立てばいいな、と思います。