////////////////////////////////////////////////////////////////////////////////
//  << j531c.java >>
//
//  スレッド(3):同期(synchronizedブロック)
//  
//  複数のスレッドを同時に実行する。ブロック単位で処理が完了するように
//  synchronizedブロックを使って実現する。
//
//  (1)synchronizedブロックをもつクラスSyncCompの定義。
//     複数のスレッドからアクセスされる。
//  (2)スレッド(Thread1)の定義
//  (3)スレッドの個数の設定。
//  (4)SyncCompクラスのオブジェクトの作成。
//  (5)複数のスレッドを格納する配列の準備。
//  (6)スレッドの作成。
//  (7)スレッドの実行。
//  (8)待機時間。
//
////////////////////////////////////////////////////////////////////////////////

//(1)
class SyncComp {
  void execute() {
    synchronized(this) {
      System.out.print("(" + Thread.currentThread().getName() + "):開始 ");
      try {
        Thread.sleep(1000); //(8)
      } catch ( InterruptedException e) { }
      System.out.println("(" + Thread.currentThread().getName() + "):終了");
    }
  }
}

//(2)                       
class Thread1 extends Thread {                         
  SyncComp obj;                                          
  Thread1(SyncComp obj) { // コンストラクタ。
    this.obj = obj;
  }                
  public void run() { obj.execute(); }    
}                                                      

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

    int n = 9; //(3)

    SyncComp obj = new SyncComp(); //(4)

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

  }

}
実行結果
% javac j531c.java
% java j531c
(Thread-0):開始 (Thread-0):終了
(Thread-1):開始 (Thread-1):終了
(Thread-2):開始 (Thread-2):終了
(Thread-3):開始 (Thread-3):終了
(Thread-4):開始 (Thread-4):終了
(Thread-5):開始 (Thread-5):終了
(Thread-6):開始 (Thread-6):終了
(Thread-7):開始 (Thread-7):終了
(Thread-8):開始 (Thread-8):終了