////////////////////////////////////////////////////////////////////////////////
//  << j522b.java >>
//
//  スレッド(2):スレッドの制御(joinメソッド)
//
//    9個のスレッドを起動し、すべてのスレッドが終了した後、mainスレッドが
//  実行を開始する。
//  
//  (1)スレッド(Thread1)の定義。
//  (2)スレッドの個数を設定。
//  (3)スレッドを格納する配列を準備する。
//  (4)スレッドの作成。
//  (5)スレッドの実行。
//  (6)th[i].join()を実行したmainスレッドは、スレッドオブジェクトthが
//     終了するまで待つ。
//  (7)1秒間スリープ。
//  
////////////////////////////////////////////////////////////////////////////////

//(1)
class Thread1 extends Thread {
  public void run() {
    String s = this.getName();
    System.out.println("スレッド(" + s + ")開始");
    try {
      Thread.sleep(1000); //(7)
    } catch ( InterruptedException e ) {  }
    System.out.println("スレッド(" + s + ")終了");
  }
}

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

    int n = 9; //(2)

    Thread1 th[] = new Thread1[n]; //(3) 
    for( int i=0; i<n; i++ ) {
      th[i] = new Thread1(); //(4) 
      th[i].start(); //(5)
    }

    String c = Thread.currentThread().getName();
    System.out.println("スレッド" + c + "が" + n + "個のスレッドの終了を待ちます");

    try {
      for( int i=0; i<n; i++ ) {
        th[i].join(); //(6)
      }
    } catch ( InterruptedException e ) { }

    System.out.println("スレッド" + c + "が" + n + "個のスレッドの終了を確認しました");

  }

}
実行結果
% javac j522b.java
% java j522b
スレッドmainが9個のスレッドの終了を待ちます
スレッド(Thread-0)開始
スレッド(Thread-1)開始
スレッド(Thread-8)開始
スレッド(Thread-2)開始
スレッド(Thread-7)開始
スレッド(Thread-6)開始
スレッド(Thread-5)開始
スレッド(Thread-4)開始
スレッド(Thread-3)開始
スレッド(Thread-0)終了
スレッド(Thread-1)終了
スレッド(Thread-2)終了
スレッド(Thread-7)終了
スレッド(Thread-6)終了
スレッド(Thread-5)終了
スレッド(Thread-4)終了
スレッド(Thread-3)終了
スレッド(Thread-8)終了
スレッドmainが9個のスレッドの終了を確認しました