--- jsr166/src/jsr166y/Phaser.java 2009/03/19 05:10:42 1.12 +++ jsr166/src/jsr166y/Phaser.java 2009/07/20 22:40:09 1.13 @@ -93,18 +93,18 @@ import java.lang.reflect.*; * idiom is for the method setting this up to first register, then * start the actions, then deregister, as in: * - *
- *  void runTasks(List<Runnable> list) {
- *    final Phaser phaser = new Phaser(1); // "1" to register self
- *    for (Runnable r : list) {
- *      phaser.register();
- *      new Thread() {
- *        public void run() {
- *          phaser.arriveAndAwaitAdvance(); // await all creation
- *          r.run();
- *          phaser.arriveAndDeregister();   // signal completion
- *        }
- *      }.start();
+ *  
 {@code
+ * void runTasks(List list) {
+ *   final Phaser phaser = new Phaser(1); // "1" to register self
+ *   for (Runnable r : list) {
+ *     phaser.register();
+ *     new Thread() {
+ *       public void run() {
+ *         phaser.arriveAndAwaitAdvance(); // await all creation
+ *         r.run();
+ *         phaser.arriveAndDeregister();   // signal completion
+ *       }
+ *     }.start();
  *   }
  *
  *   doSomethingOnBehalfOfWorkers();
@@ -113,59 +113,55 @@ import java.lang.reflect.*;
  *   p = phaser.awaitAdvance(p); // ... and await arrival
  *   otherActions(); // do other things while tasks execute
  *   phaser.awaitAdvance(p); // await final completion
- * }
- * 
+ * }}
* *

One way to cause a set of threads to repeatedly perform actions * for a given number of iterations is to override {@code onAdvance}: * - *

- *  void startTasks(List<Runnable> list, final int iterations) {
- *    final Phaser phaser = new Phaser() {
- *       public boolean onAdvance(int phase, int registeredParties) {
- *         return phase >= iterations || registeredParties == 0;
+ *  
 {@code
+ * void startTasks(List list, final int iterations) {
+ *   final Phaser phaser = new Phaser() {
+ *     public boolean onAdvance(int phase, int registeredParties) {
+ *       return phase >= iterations || registeredParties == 0;
+ *     }
+ *   };
+ *   phaser.register();
+ *   for (Runnable r : list) {
+ *     phaser.register();
+ *     new Thread() {
+ *       public void run() {
+ *         do {
+ *           r.run();
+ *           phaser.arriveAndAwaitAdvance();
+ *         } while(!phaser.isTerminated();
  *       }
- *    };
- *    phaser.register();
- *    for (Runnable r : list) {
- *      phaser.register();
- *      new Thread() {
- *        public void run() {
- *           do {
- *             r.run();
- *             phaser.arriveAndAwaitAdvance();
- *           } while(!phaser.isTerminated();
- *        }
- *      }.start();
+ *     }.start();
  *   }
  *   phaser.arriveAndDeregister(); // deregister self, don't wait
- * }
- * 
+ * }}
* *

To create a set of tasks using a tree of Phasers, * you could use code of the following form, assuming a * Task class with a constructor accepting a Phaser that * it registers for upon construction: - *

- *  void build(Task[] actions, int lo, int hi, Phaser b) {
- *    int step = (hi - lo) / TASKS_PER_PHASER;
- *    if (step > 1) {
- *       int i = lo;
- *       while (i < hi) {
- *         int r = Math.min(i + step, hi);
- *         build(actions, i, r, new Phaser(b));
- *         i = r;
- *       }
- *    }
- *    else {
- *      for (int i = lo; i < hi; ++i)
- *        actions[i] = new Task(b);
- *        // assumes new Task(b) performs b.register()
- *    }
- *  }
- *  // .. initially called, for n tasks via
- *  build(new Task[n], 0, n, new Phaser());
- * 
+ *
 {@code
+ * void build(Task[] actions, int lo, int hi, Phaser b) {
+ *   int step = (hi - lo) / TASKS_PER_PHASER;
+ *   if (step > 1) {
+ *     int i = lo;
+ *     while (i < hi) {
+ *       int r = Math.min(i + step, hi);
+ *       build(actions, i, r, new Phaser(b));
+ *       i = r;
+ *     }
+ *   } else {
+ *     for (int i = lo; i < hi; ++i)
+ *       actions[i] = new Task(b);
+ *       // assumes new Task(b) performs b.register()
+ *   }
+ * }
+ * // .. initially called, for n tasks via
+ * build(new Task[n], 0, n, new Phaser());}
* * The best value of {@code TASKS_PER_PHASER} depends mainly on * expected barrier synchronization rates. A value as low as four may