5. スレッドの同期
マルチスレッドプログラミング 5章 スレッドの同期
- 5.1. 他のスレッドの終了を待つ
- 5.2. スレッド間の待ち合わせ
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つのスレッドに分けること。
- 進行状況を表示するスレッド
- ファイルの内容を読み込むスレッド
- ファイルの内容を書き出すスレッド