HOME> Javaアプリケーション講座> スレッド>スレッドの終了を待つ

スレッドの終了を待つ

今までは、各スレッドがまったく別々の流れで処理が行なわれてきました。
しかし、別のスレッドの終わりを待って、自分の処理の再開をすることもできます。

そのときに使用するメソッドがjoin()メソッドです。

join()メソッドはインスタンスメソッドなので必ずインスタンスしてからでないと使用できません。

また、join()メソッドもsleep()メソッド同様にtry catch文を記述しなければいけません。

では、サンプルプログラムを見ていきます。

サンプルプログラム(Sample86.java)

class ThreadSample86 extends Thread{


   public void run(){
       for(int i = 0 ; i < 5 ; i++){
          try{

              //スレッドの休止
             Thread.sleep(1000);
 System.out.println( i + "回目の処理です");

   }catch(InterruptedException e){}
  
      }
  }
}



class Sample86{
    public static void main(String args[]){

   try{
      ThreadSample86 th = new ThreadSample86();
     System.out.println("スレッドを開始します");
       
       th.start();
       //スレッドの終了を待ちます。
       th.join();
      System.out.println("-------------------------------------");
      System.out.println("これ以降スレッドが終了してから処理されます");
       for(int j = 0 ; j < 5 ; j++){
          System.out.println( j + "回目のmainの処理です");
   }
  }catch(InterruptedException e){}
} }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

このプログラムではまず、strat()メソッドでrun()メソッドを起動しましたが、
その後にjoin()メソッドでスレッドの処理が終わるまでその後の処理は待機状態にしています。
スレッドの処理が終了した後にその後の処理を開始しています。

また、最初に説明しましたがjoin()メソッドはインスタンスメソッドです。
必ず、オブジェクトの作成をしてインスタンスしなければいけません。

もしも、上記サンプルでjoin()メソッドがなかったらどうなるでしょうか? これもサンプルプログラムで確認したいと思います。

サンプルプログラム(Sample86_1.java)

class ThreadSample86_1 extends Thread{


   public void run(){
       for(int i = 0 ; i < 5 ; i++){
          try{

              //スレッドの休止
             Thread.sleep(1000);
 System.out.println( i + "回目の処理です");

   }catch(InterruptedException e){}
  
      }
  }
}

class Sample86_1{
    public static void main(String args[]){
 
      ThreadSample86_1 th = new ThreadSample86_1();
     System.out.println("スレッドを開始します");
       
       th.start();

      System.out.println("-------------------------------------");
      System.out.println("これ以降スレッドが終了してから処理されます");
       for(int j = 0 ; j < 5 ; j++){
          System.out.println( j + "回目のmainの処理です");
   }

} }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行します。

Sample86_1ではただSample86のプログラムでjoin()メソッドを定義していないだけですが結果はまったく異なります。
つまりSample86_1のほうはjoin()メソッドを定義していないので通常のスレッドの処理が行われています。

ページのトップへ戻る