next up previous
Next: 自習 Up: 17 デーモンスレッド Previous: 17.2 スレッドの例 2

17.3 スレッドの例 3

複数のスレッドの同期をとる例.
/*
 * ap/basic/Barrier.java
 */

package basic;

class Barrier {
  int numThreads = 0;
  int waitThreads = 0;

  synchronized void syncAll() {
    waitThreads++;
    if (waitThreads == numThreads) {
      waitThreads = 0;
      notifyAll();
    } else {
      try {
        wait();
      } catch (InterruptedException e) {}
    }
  }

  public static void main (String args[]) {
    Barrier barrier = new Barrier();
    Thread pn0 = new Thread(new PrintNumber(barrier, 0));
    Thread pn1 = new Thread(new PrintNumber(barrier, 1));
    Thread pn2 = new Thread(new PrintNumber(barrier, 2));
    pn0.start();
    pn1.start();
    pn2.start();
  }
}
/*
 * ap/basic/PrintNumber.java
 */
package basic;

class PrintNumber implements Runnable {
  Barrier barrier;
  int num;

  PrintNumber(Barrier barrier, int num) {
    this.barrier = barrier;
    this.num = num;
    barrier.numThreads++;
  }

  public void run() {
    String blanks = "";
    for (int i = 0; i < 10; i++) {
      System.out.println(blanks + num);
      blanks += " "; // blanks = blanks + " ";
    }
    barrier.syncAll();
    System.out.println(blanks + num);
  }
}
ap> javac basic/Barrier.java
ap> java basic.Barrier
0
 0
  0
   0
    0
     0
      0
       0
        0
         0
1
 1
  1
   1
    1
     1
      1
       1
        1
         1
2
 2
  2
   2
    2
     2
      2
       2
        2
         2
          0
          1
          2


generated through LaTeX2HTML. M.Inaba 平成18年5月7日