Next: 自習
Up: 17 デーモンスレッド
Previous: 17.2 スレッドの例 2
複数のスレッドの同期をとる例.
/*
* 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日