Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

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
 1: public class JoinTest extends Thread {
 2: 
 3:   public void run() {
 4:     for (int i = 3; i >= 0 ; i--) {
 5:       try {
 6:         sleep(1000);
 7:       } catch (InterruptedException e) {}
 8:       System.out.println(i);
 9:     }
10:   }
11: 
12:   public static void main(String[] args) {
13:     JoinTest t = new JoinTest();
14:     t.start();
15:     try {
16:       System.out.println("スレッド t の終了を待機します。");
17:       t.join(); // カウントダウンが終了するのを待つ
18:       System.out.println("スレッド t が終了しました。");
19:     } catch (InterruptedException e) {}
20:   }
21: 
22: }

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

プログラム実行の図

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

(実習課題1)

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

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

解答例はこちら



前のページへ TECHSCOREのTOPページへ 次のページへ
TECHSCORE PR
PR
PR
PR
PR
PR

techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa