--- jsr166/src/jsr166y/Phaser.java 2009/03/19 04:49:44 1.11 +++ jsr166/src/jsr166y/Phaser.java 2009/07/22 01:36:51 1.16 @@ -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 @@ -179,6 +175,9 @@ import java.lang.reflect.*; * parties result in IllegalStateExceptions. However, you can and * should create tiered phasers to accommodate arbitrarily large sets * of participants. + * + * @since 1.7 + * @author Doug Lea */ public class Phaser { /* @@ -238,7 +237,7 @@ public class Phaser { } /** - * Returns message string for bad bounds exceptions + * Returns message string for bad bounds exceptions. */ private static String badBounds(int parties, int unarrived) { return ("Attempt to set " + unarrived + @@ -313,9 +312,10 @@ public class Phaser { /** * Creates a new Phaser with the given numbers of registered * unarrived parties, initial phase number 0, and no parent. - * @param parties the number of parties required to trip barrier. + * + * @param parties the number of parties required to trip barrier * @throws IllegalArgumentException if parties less than zero - * or greater than the maximum number of parties supported. + * or greater than the maximum number of parties supported */ public Phaser(int parties) { this(null, parties); @@ -326,7 +326,8 @@ public class Phaser { * initially registered parties. If parent is non-null this phaser * is registered with the parent and its initial phase number is * the same as that of parent phaser. - * @param parent the parent phaser. + * + * @param parent the parent phaser */ public Phaser(Phaser parent) { int phase = 0; @@ -342,13 +343,14 @@ public class Phaser { /** * Creates a new Phaser with the given parent and numbers of - * registered unarrived parties. If parent is non-null this phaser + * registered unarrived parties. If parent is non-null, this phaser * is registered with the parent and its initial phase number is * the same as that of parent phaser. - * @param parent the parent phaser. - * @param parties the number of parties required to trip barrier. + * + * @param parent the parent phaser + * @param parties the number of parties required to trip barrier * @throws IllegalArgumentException if parties less than zero - * or greater than the maximum number of parties supported. + * or greater than the maximum number of parties supported */ public Phaser(Phaser parent, int parties) { if (parties < 0 || parties > ushortMask) @@ -366,9 +368,10 @@ public class Phaser { /** * Adds a new unarrived party to this phaser. + * * @return the current barrier phase number upon registration * @throws IllegalStateException if attempting to register more - * than the maximum supported number of parties. + * than the maximum supported number of parties */ public int register() { return doRegister(1); @@ -376,10 +379,11 @@ public class Phaser { /** * Adds the given number of new unarrived parties to this phaser. - * @param parties the number of parties required to trip barrier. + * + * @param parties the number of parties required to trip barrier * @return the current barrier phase number upon registration * @throws IllegalStateException if attempting to register more - * than the maximum supported number of parties. + * than the maximum supported number of parties */ public int bulkRegister(int parties) { if (parties < 0) @@ -399,7 +403,7 @@ public class Phaser { phase = phaseOf(s); int unarrived = unarrivedOf(s) + registrations; int parties = partiesOf(s) + registrations; - if (phase < 0) + if (phase < 0) break; if (parties > ushortMask || unarrived > ushortMask) throw new IllegalStateException(badBounds(parties, unarrived)); @@ -415,9 +419,9 @@ public class Phaser { * in turn wait for others via {@link #awaitAdvance}). * * @return the barrier phase number upon entry to this method, or a - * negative value if terminated; + * negative value if terminated * @throws IllegalStateException if not terminated and the number - * of unarrived parties would become negative. + * of unarrived parties would become negative */ public int arrive() { int phase; @@ -467,9 +471,9 @@ public class Phaser { * zero parties, this phaser is also deregistered from its parent. * * @return the current barrier phase number upon entry to - * this method, or a negative value if terminated; + * this method, or a negative value if terminated * @throws IllegalStateException if not terminated and the number - * of registered or unarrived parties would become negative. + * of registered or unarrived parties would become negative */ public int arriveAndDeregister() { // similar code to arrive, but too different to merge @@ -520,9 +524,10 @@ public class Phaser { * to {@code awaitAdvance(arrive())}. If you instead need to * await with interruption of timeout, and/or deregister upon * arrival, you can arrange them using analogous constructions. + * * @return the phase on entry to this method * @throws IllegalStateException if not terminated and the number - * of unarrived parties would become negative. + * of unarrived parties would become negative */ public int arriveAndAwaitAdvance() { return awaitAdvance(arrive()); @@ -532,6 +537,7 @@ public class Phaser { * Awaits the phase of the barrier to advance from the given * value, or returns immediately if argument is negative or this * barrier is terminated. + * * @param phase the phase on entry to this method * @return the phase on exit from this method */ @@ -553,11 +559,12 @@ public class Phaser { * value, or returns immediately if argument is negative or this * barrier is terminated, or throws InterruptedException if * interrupted while waiting. + * * @param phase the phase on entry to this method * @return the phase on exit from this method * @throws InterruptedException if thread interrupted while waiting */ - public int awaitAdvanceInterruptibly(int phase) + public int awaitAdvanceInterruptibly(int phase) throws InterruptedException { if (phase < 0) return phase; @@ -574,6 +581,7 @@ public class Phaser { * Awaits the phase of the barrier to advance from the given value * or the given timeout elapses, or returns immediately if * argument is negative or this barrier is terminated. + * * @param phase the phase on entry to this method * @return the phase on exit from this method * @throws InterruptedException if thread interrupted while waiting @@ -620,6 +628,7 @@ public class Phaser { * Returns the current phase number. The maximum phase number is * {@code Integer.MAX_VALUE}, after which it restarts at * zero. Upon termination, the phase number is negative. + * * @return the phase number, or a negative value if terminated */ public final int getPhase() { @@ -628,6 +637,7 @@ public class Phaser { /** * Returns {@code true} if the current phase number equals the given phase. + * * @param phase the phase * @return {@code true} if the current phase number equals the given phase */ @@ -637,6 +647,7 @@ public class Phaser { /** * Returns the number of parties registered at this barrier. + * * @return the number of parties */ public int getRegisteredParties() { @@ -646,6 +657,7 @@ public class Phaser { /** * Returns the number of parties that have arrived at the current * phase of this barrier. + * * @return the number of arrived parties */ public int getArrivedParties() { @@ -655,6 +667,7 @@ public class Phaser { /** * Returns the number of registered parties that have not yet * arrived at the current phase of this barrier. + * * @return the number of unarrived parties */ public int getUnarrivedParties() { @@ -663,6 +676,7 @@ public class Phaser { /** * Returns the parent of this phaser, or null if none. + * * @return the parent of this phaser, or null if none */ public Phaser getParent() { @@ -672,6 +686,7 @@ public class Phaser { /** * Returns the root ancestor of this phaser, which is the same as * this phaser if it has no parent. + * * @return the root ancestor of this phaser */ public Phaser getRoot() { @@ -680,6 +695,7 @@ public class Phaser { /** * Returns {@code true} if this barrier has been terminated. + * * @return {@code true} if this barrier has been terminated */ public boolean isTerminated() { @@ -795,7 +811,7 @@ public class Phaser { try { ForkJoinPool.managedBlock(this, false); } catch (InterruptedException ie) { - } + } } return wasInterrupted; } @@ -803,7 +819,7 @@ public class Phaser { } /** - * Removes and signals waiting threads from wait queue + * Removes and signals waiting threads from wait queue. */ private void releaseWaiters(int phase) { AtomicReference