目次へ

5. スレッドの同期

5.1. 他のスレッドの終了を待つ

別のスレッドにある処理を任せ、そのスレッドが終了したときに、自分のスレッドの処理を再開したいという場面があります。このようなとき、Threadクラスのjoinメソッドを利用します。

joinメソッドには、引数の異なる3つのメソッドがあります。

  • void join()
  • void join(long millis)
  • void join(long millis, int nanos)

join()は該当のスレッドが終了するのを永久に待ちつづけます。引数のあるものは、該当のスレッドが終了しなくても、指定した時間経過すれば処理を再開します(ただし、join(0)はjoin()と同じように永遠に待機します)。いずれのメソッドも、外部のスレッドよりinterruptメソッドで割り込まれた場合、InterruptedExceptionを発生して処理を終了します。

次のプログラムは、新しいスレッドでカウントダウンを実行し、メインのスレッドではカウントダウンの終了を待ってメッセージを表示します。

リスト JoinTest.java
  public class JoinTest extends Thread {
  
    public void run() {
      for (int i = 3; i >= 0 ; i--) {
        try {
          sleep(1000);
        } catch (InterruptedException e) {}
        System.out.println(i);
      }
   }
 
   public static void main(String[] args) {
     JoinTest t = new JoinTest();
     t.start();
     try {
       System.out.println("スレッド t の終了を待機します。");
       t.join(); // カウントダウンが終了するのを待つ
       System.out.println("スレッド t が終了しました。");
     } catch (InterruptedException e) {}
   }
 
 }

このプログラムを実行すると、次のような結果となります。

プログラム実行の図

カウントダウンのスレッドが終了してから、終了のメッセージを表示していることがわかります。

(実習課題1)

以下のコンソールプログラムを作成しなさい。

  • ファイルをコピーするプログラム。ファイル内容を一旦プログラムに全て読み込んでから、書き込みを行うようにする事。
  • 3つのスレッドに分けること。
    • 進行状況を表示するスレッド
    • ファイルの内容を読み込むスレッド
    • ファイルの内容を書き出すスレッド

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp