/* * 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