APIdia Launch Partner
Top Description Inners Fields Constructors Methods
java.util.concurrent

public Class Phaser

extends Object
Class Inheritance
Imports
jdk.internal.invoke.MhUtil, java.lang.invoke.MethodHandles, .VarHandle, java.util.concurrent.atomic.AtomicReference, java.util.concurrent.locks.LockSupport

A reusable synchronization barrier, similar in functionality to CyclicBarrier and CountDownLatch but supporting more flexible usage.

Registration. Unlike the case for other barriers, the number of parties registered to synchronize on a phaser may vary over time. Tasks may be registered at any time (using methods register, bulkRegister, or forms of constructors establishing initial numbers of parties), and optionally deregistered upon any arrival (using arriveAndDeregister). As is the case with most basic synchronization constructs, registration and deregistration affect only internal counts; they do not establish any further internal bookkeeping, so tasks cannot query whether they are registered. (However, you can introduce such bookkeeping by subclassing this class.)

Synchronization. Like a CyclicBarrier, a Phaser may be repeatedly awaited. Method arriveAndAwaitAdvance has effect analogous to CyclicBarrier.await. Each generation of a phaser has an associated phase number. The phase number starts at zero, and advances when all parties arrive at the phaser, wrapping around to zero after reaching Integer.MAX_VALUE. The use of phase numbers enables independent control of actions upon arrival at a phaser and upon awaiting others, via two kinds of methods that may be invoked by any registered party:

Termination. A phaser may enter a termination state, that may be checked using method isTerminated. Upon termination, all synchronization methods immediately return without waiting for advance, as indicated by a negative return value. Similarly, attempts to register upon termination have no effect. Termination is triggered when an invocation of onAdvance returns true. The default implementation returns true if a deregistration has caused the number of registered parties to become zero. As illustrated below, when phasers control actions with a fixed number of iterations, it is often convenient to override this method to cause termination when the current phase number reaches a threshold. Method forceTermination is also available to abruptly release waiting threads and allow them to terminate.

Tiering. Phasers may be tiered (i.e., constructed in tree structures) to reduce contention. Phasers with large numbers of parties that would otherwise experience heavy synchronization contention costs may instead be set up so that groups of sub-phasers share a common parent. This may greatly increase throughput even though it incurs greater per-operation overhead.

In a tree of tiered phasers, registration and deregistration of child phasers with their parent are managed automatically. Whenever the number of registered parties of a child phaser becomes non-zero (as established in the Phaser(Phaser, int) constructor, register, or bulkRegister), the child phaser is registered with its parent. Whenever the number of registered parties becomes zero as the result of an invocation of arriveAndDeregister, the child phaser is deregistered from its parent.

Monitoring. While synchronization methods may be invoked only by registered parties, the current state of a phaser may be monitored by any caller. At any given moment there are getRegisteredParties parties in total, of which getArrivedParties have arrived at the current phase (getPhase). When the remaining (getUnarrivedParties) parties arrive, the phase advances. The values returned by these methods may reflect transient states and so are not in general useful for synchronization control. Method toString returns snapshots of these state queries in a form convenient for informal monitoring.

Memory consistency effects: Actions prior to any form of arrive method happen-before a corresponding phase advance and onAdvance actions (if present), which in turn happen-before actions following the phase advance.

Sample usages:

A Phaser may be used instead of a CountDownLatch to control a one-shot action serving a variable number of parties. The typical idiom is for the method setting this up to first register, then start all the actions, then deregister, as in:

 void runTasks(List<Runnable> tasks) {
  Phaser startingGate = new Phaser(1); // "1" to register self
  // create and start threads
  for (Runnable task : tasks) {
    startingGate.register();
    new Thread(() -> {
      startingGate.arriveAndAwaitAdvance();
      task.run();
    }).start();
  }

  // deregister self to allow threads to proceed
  startingGate.arriveAndDeregister();
}

One way to cause a set of threads to repeatedly perform actions for a given number of iterations is to override onAdvance:

 void startTasks(List<Runnable> tasks, int iterations) {
  Phaser phaser = new Phaser() {
    protected boolean onAdvance(int phase, int registeredParties) {
      return phase >= iterations - 1 || registeredParties == 0;
    }
  };
  phaser.register();
  for (Runnable task : tasks) {
    phaser.register();
    new Thread(() -> {
      do {
        task.run();
        phaser.arriveAndAwaitAdvance();
      } while (!phaser.isTerminated());
    }).start();
  }
  // allow threads to proceed; don't wait for them
  phaser.arriveAndDeregister();
}
If the main task must later await termination, it may re-register and then execute a similar loop:
 // ...
  phaser.register();
  while (!phaser.isTerminated())
    phaser.arriveAndAwaitAdvance();

Related constructions may be used to await particular phase numbers in contexts where you are sure that the phase will never wrap around Integer.MAX_VALUE. For example:

 void awaitPhase(Phaser phaser, int phase) {
  int p = phaser.register(); // assumes caller not already registered
  while (p < phase) {
    if (phaser.isTerminated())
      // ... deal with unexpected termination
    else
      p = phaser.arriveAndAwaitAdvance();
  }
  phaser.arriveAndDeregister();
}

To create a set of n 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 with upon construction. After invocation of build(new Task[n], 0, n, new Phaser()), these tasks could then be started, for example by submitting to a pool:

 void build(Task[] tasks, int lo, int hi, Phaser ph) {
  if (hi - lo > TASKS_PER_PHASER) {
    for (int i = lo; i < hi; i += TASKS_PER_PHASER) {
      int j = Math.min(i + TASKS_PER_PHASER, hi);
      build(tasks, i, j, new Phaser(ph));
    }
  } else {
    for (int i = lo; i < hi; ++i)
      tasks[i] = new Task(ph);
      // assumes new Task(ph) performs ph.register()
  }
}
The best value of TASKS_PER_PHASER depends mainly on expected synchronization rates. A value as low as four may be appropriate for extremely small per-phase task bodies (thus high rates), or up to hundreds for extremely large ones.

Implementation Notes

This implementation restricts the maximum number of parties to 65535. Attempts to register additional parties result in IllegalStateException. However, you can and should create tiered phasers to accommodate arbitrarily large sets of participants.

Author
Doug Lea
Since
1.7

Nested and Inner Type Summary

Modifier and TypeClass and Description
pack-priv static class
Phaser.QNode

Wait nodes for Treiber stack representing wait queue.

Field Summary

Modifier and TypeField and Description
private static final long
private static final int
private final AtomicReference<Phaser.QNode>
evenQ

Heads of Treiber stacks for waiting threads.

private static final int
private static final int
private static final int
NCPU

The number of CPUs, for spin control

private final AtomicReference<Phaser.QNode>
private static final int
private static final int
private static final int
private final Phaser
parent

The parent of this phaser, or null if none.

private static final long
private static final int
private static final int
private final Phaser
root

The root of phaser tree.

pack-priv static final int
SPINS_PER_ARRIVAL

The number of times to spin before blocking while waiting for advance, per arrival while waiting.

private volatile long
state

Primary state representation, holding four bit-fields: unarrived -- the number of parties yet to hit barrier (bits 0-15) parties -- the number of parties to wait (bits 16-31) phase -- the generation of the barrier (bits 32-62) terminated -- set if barrier is terminated (bit 63 / sign) Except that a phaser with no registered parties is distinguished by the otherwise illegal state of having zero parties and one unarrived parties (encoded as EMPTY below).

private static final VarHandle
private static final long
private static final int

Constructor Summary

AccessConstructor and Description
public
Phaser()

Creates a new phaser with no initially registered parties, no parent, and initial phase number 0.

public
Phaser(int
the number of parties required to advance to the next phase
parties
)

Creates a new phaser with the given number of registered unarrived parties, no parent, and initial phase number 0.

public
Phaser(Phaser
the parent phaser
parent
)

Equivalent to Phaser(parent, 0).

public
Phaser(Phaser
the parent phaser
parent
,
int
the number of parties required to advance to the next phase
parties
)

Creates a new phaser with the given parent and number of registered unarrived parties.

Method Summary

Modifier and TypeMethod and Description
private int

Returns:

current phase on exit
abortWait
(int phase)

Variant of releaseWaiters that additionally tries to remove any nodes no longer waiting for advance due to timeout or interrupt.

public int

Returns:

the arrival phase number, or a negative value if terminated
arrive
()

Arrives at this phaser, without waiting for others to arrive.

public int

Returns:

the arrival phase number, or the (negative) current phase if terminated
arriveAndAwaitAdvance
()

Arrives at this phaser and awaits others.

public int

Returns:

the arrival phase number, or a negative value if terminated
arriveAndDeregister
()

Arrives at this phaser and deregisters from it without waiting for others to arrive.

private static int
arrivedOf(long s)

public int

Returns:

the next arrival phase number, or the argument if it is negative, or the (negative) current phase if terminated
awaitAdvance
(int
an arrival phase number, or negative value if terminated; this argument is normally the value returned by a previous call to arrive or arriveAndDeregister.
phase
)

Awaits the phase of this phaser to advance from the given phase value, returning immediately if the current phase is not equal to the given phase value or this phaser is terminated.

public int

Returns:

the next arrival phase number, or the argument if it is negative, or the (negative) current phase if terminated
awaitAdvanceInterruptibly
(int
an arrival phase number, or negative value if terminated; this argument is normally the value returned by a previous call to arrive or arriveAndDeregister.
phase
)

Awaits the phase of this phaser to advance from the given phase value, throwing InterruptedException if interrupted while waiting, or returning immediately if the current phase is not equal to the given phase value or this phaser is terminated.

public int

Returns:

the next arrival phase number, or the argument if it is negative, or the (negative) current phase if terminated
awaitAdvanceInterruptibly
(int
an arrival phase number, or negative value if terminated; this argument is normally the value returned by a previous call to arrive or arriveAndDeregister.
phase
,
long
how long to wait before giving up, in units of unit
timeout
,
TimeUnit
a TimeUnit determining how to interpret the timeout parameter
unit
)

Awaits the phase of this phaser to advance from the given phase value or the given timeout to elapse, throwing InterruptedException if interrupted while waiting, or returning immediately if the current phase is not equal to the given phase value or this phaser is terminated.

private String
badArrive(long s)

Returns message string for bounds exceptions on arrival.

private String
badRegister(long s)

Returns message string for bounds exceptions on registration.

public int

Returns:

the arrival phase number to which this registration applied. If this value is negative, then this phaser has terminated, in which case registration has no effect.
bulkRegister
(int
the number of additional parties required to advance to the next phase
parties
)

Adds the given number of new unarrived parties to this phaser.

private int
doArrive(int
value to subtract from state; ONE_ARRIVAL for arrive, ONE_DEREGISTER for arriveAndDeregister
adjust
)

Main implementation for methods arrive and arriveAndDeregister.

private int
doRegister(int
number to add to both parties and unarrived fields. Must be greater than zero.
registrations
)

Implementation of register, bulkRegister.

public void
forceTermination()

Forces this phaser to enter termination state.

public int

Returns:

the number of arrived parties
getArrivedParties
()

Returns the number of registered parties that have arrived at the current phase of this phaser.

public Phaser

Returns:

the parent of this phaser, or null if none
getParent
()

Returns the parent of this phaser, or null if none.

public final int

Returns:

the phase number, or a negative value if terminated
getPhase
()

Returns the current phase number.

public int

Returns:

the number of parties
getRegisteredParties
()

Returns the number of parties registered at this phaser.

public Phaser

Returns:

the root ancestor of this phaser
getRoot
()

Returns the root ancestor of this phaser, which is the same as this phaser if it has no parent.

public int

Returns:

the number of unarrived parties
getUnarrivedParties
()

Returns the number of registered parties that have not yet arrived at the current phase of this phaser.

private int

Returns:

current phase
internalAwaitAdvance
(int
current phase
phase
,
Phaser.QNode
if non-null, the wait node to track interrupt and timeout; if null, denotes noninterruptible wait
node
)

Possibly blocks and waits for phase to advance unless aborted.

public boolean

Returns:

true if this phaser has been terminated
isTerminated
()

Returns true if this phaser has been terminated.

protected boolean

Returns:

true if this phaser should terminate
onAdvance
(int
the current phase number on entry to this method, before this phaser is advanced
phase
,
int
the current number of registered parties
registeredParties
)

Overridable method to perform an action upon impending phase advance, and to control termination.

private static int
partiesOf(long s)

private static int
phaseOf(long s)

private long

Returns:

reconciled state
reconcileState
()

Resolves lagged phase propagation from root if necessary.

public int

Returns:

the arrival phase number to which this registration applied. If this value is negative, then this phaser has terminated, in which case registration has no effect.
register
()

Adds a new unarrived party to this phaser.

private void
releaseWaiters(int phase)

Removes and signals threads from queue for phase.

private String
stateToString(long s)

Implementation of toString and string-based error messages.

public String

Returns:

a string identifying this phaser, as well as its state
toString
()

Overrides java.lang.Object.toString.

Returns a string identifying this phaser, as well as its state.

private static int
unarrivedOf(long s)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAllwaitwaitwait

Field Detail

COUNTS_MASKback to summary
private static final long COUNTS_MASK
EMPTYback to summary
private static final int EMPTY
evenQback to summary
private final AtomicReference<Phaser.QNode> evenQ

Heads of Treiber stacks for waiting threads. To eliminate contention when releasing some threads while adding others, we use two of them, alternating across even and odd phases. Subphasers share queues with root to speed up releases.

MAX_PARTIESback to summary
private static final int MAX_PARTIES
MAX_PHASEback to summary
private static final int MAX_PHASE
NCPUback to summary
private static final int NCPU

The number of CPUs, for spin control

oddQback to summary
private final AtomicReference<Phaser.QNode> oddQ
ONE_ARRIVALback to summary
private static final int ONE_ARRIVAL
ONE_DEREGISTERback to summary
private static final int ONE_DEREGISTER
ONE_PARTYback to summary
private static final int ONE_PARTY
parentback to summary
private final Phaser parent

The parent of this phaser, or null if none.

PARTIES_MASKback to summary
private static final long PARTIES_MASK
PARTIES_SHIFTback to summary
private static final int PARTIES_SHIFT
PHASE_SHIFTback to summary
private static final int PHASE_SHIFT
rootback to summary
private final Phaser root

The root of phaser tree. Equals this if not in a tree.

SPINS_PER_ARRIVALback to summary
pack-priv static final int SPINS_PER_ARRIVAL

The number of times to spin before blocking while waiting for advance, per arrival while waiting. On multiprocessors, fully blocking and waking up a large number of threads all at once is usually a very slow process, so we use rechargeable spins to avoid it when threads regularly arrive: When a thread in internalAwaitAdvance notices another arrival before blocking, and there appear to be enough CPUs available, it spins SPINS_PER_ARRIVAL more times before blocking. The value trades off good-citizenship vs big unnecessary slowdowns.

stateback to summary
private volatile long state

Primary state representation, holding four bit-fields: unarrived -- the number of parties yet to hit barrier (bits 0-15) parties -- the number of parties to wait (bits 16-31) phase -- the generation of the barrier (bits 32-62) terminated -- set if barrier is terminated (bit 63 / sign) Except that a phaser with no registered parties is distinguished by the otherwise illegal state of having zero parties and one unarrived parties (encoded as EMPTY below). To efficiently maintain atomicity, these values are packed into a single (atomic) long. Good performance relies on keeping state decoding and encoding simple, and keeping race windows short. All state updates are performed via CAS except initial registration of a sub-phaser (i.e., one with a non-null parent). In this (relatively rare) case, we use built-in synchronization to lock while first registering with its parent. The phase of a subphaser is allowed to lag that of its ancestors until it is actually accessed -- see method reconcileState.

STATEback to summary
private static final VarHandle STATE
TERMINATION_BITback to summary
private static final long TERMINATION_BIT
UNARRIVED_MASKback to summary
private static final int UNARRIVED_MASK

Constructor Detail

Phaserback to summary
public Phaser()

Creates a new phaser with no initially registered parties, no parent, and initial phase number 0. Any thread using this phaser will need to first register for it.

Phaserback to summary
public Phaser(int parties)

Creates a new phaser with the given number of registered unarrived parties, no parent, and initial phase number 0.

Parameters
parties:int

the number of parties required to advance to the next phase

Exceptions
IllegalArgumentException:
if parties less than zero or greater than the maximum number of parties supported
Phaserback to summary
public Phaser(Phaser parent)

Equivalent to Phaser(parent, 0).

Parameters
parent:Phaser

the parent phaser

Phaserback to summary
public Phaser(Phaser parent, int parties)

Creates a new phaser with the given parent and number of registered unarrived parties. When the given parent is non-null and the given number of parties is greater than zero, this child phaser is registered with its parent.

Parameters
parent:Phaser

the parent phaser

parties:int

the number of parties required to advance to the next phase

Exceptions
IllegalArgumentException:
if parties less than zero or greater than the maximum number of parties supported

Method Detail

abortWaitback to summary
private int abortWait(int phase)

Variant of releaseWaiters that additionally tries to remove any nodes no longer waiting for advance due to timeout or interrupt. Currently, nodes are removed only if they are at head of queue, which suffices to reduce memory footprint in most usages.

Returns:int

current phase on exit

arriveback to summary
public int arrive()

Arrives at this phaser, without waiting for others to arrive.

It is a usage error for an unregistered party to invoke this method. However, this error may result in an IllegalStateException only upon some subsequent operation on this phaser, if ever.

Returns:int

the arrival phase number, or a negative value if terminated

Exceptions
IllegalStateException:
if not terminated and the number of unarrived parties would become negative
arriveAndAwaitAdvanceback to summary
public int arriveAndAwaitAdvance()

Arrives at this phaser and awaits others. Equivalent in effect to awaitAdvance(arrive()). If you need to await with interruption or timeout, you can arrange this with an analogous construction using one of the other forms of the awaitAdvance method. If instead you need to deregister upon arrival, use awaitAdvance(arriveAndDeregister()).

It is a usage error for an unregistered party to invoke this method. However, this error may result in an IllegalStateException only upon some subsequent operation on this phaser, if ever.

Returns:int

the arrival phase number, or the (negative) current phase if terminated

Exceptions
IllegalStateException:
if not terminated and the number of unarrived parties would become negative
arriveAndDeregisterback to summary
public int arriveAndDeregister()

Arrives at this phaser and deregisters from it without waiting for others to arrive. Deregistration reduces the number of parties required to advance in future phases. If this phaser has a parent, and deregistration causes this phaser to have zero parties, this phaser is also deregistered from its parent.

It is a usage error for an unregistered party to invoke this method. However, this error may result in an IllegalStateException only upon some subsequent operation on this phaser, if ever.

Returns:int

the arrival phase number, or a negative value if terminated

Exceptions
IllegalStateException:
if not terminated and the number of registered or unarrived parties would become negative
arrivedOfback to summary
private static int arrivedOf(long s)
awaitAdvanceback to summary
public int awaitAdvance(int phase)

Awaits the phase of this phaser to advance from the given phase value, returning immediately if the current phase is not equal to the given phase value or this phaser is terminated.

Parameters
phase:int

an arrival phase number, or negative value if terminated; this argument is normally the value returned by a previous call to arrive or arriveAndDeregister.

Returns:int

the next arrival phase number, or the argument if it is negative, or the (negative) current phase if terminated

awaitAdvanceInterruptiblyback to summary
public int awaitAdvanceInterruptibly(int phase) throws InterruptedException

Awaits the phase of this phaser to advance from the given phase value, throwing InterruptedException if interrupted while waiting, or returning immediately if the current phase is not equal to the given phase value or this phaser is terminated.

Parameters
phase:int

an arrival phase number, or negative value if terminated; this argument is normally the value returned by a previous call to arrive or arriveAndDeregister.

Returns:int

the next arrival phase number, or the argument if it is negative, or the (negative) current phase if terminated

Exceptions
InterruptedException:
if thread interrupted while waiting
awaitAdvanceInterruptiblyback to summary
public int awaitAdvanceInterruptibly(int phase, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

Awaits the phase of this phaser to advance from the given phase value or the given timeout to elapse, throwing InterruptedException if interrupted while waiting, or returning immediately if the current phase is not equal to the given phase value or this phaser is terminated.

Parameters
phase:int

an arrival phase number, or negative value if terminated; this argument is normally the value returned by a previous call to arrive or arriveAndDeregister.

timeout:long

how long to wait before giving up, in units of unit

unit:TimeUnit

a TimeUnit determining how to interpret the timeout parameter

Returns:int

the next arrival phase number, or the argument if it is negative, or the (negative) current phase if terminated

Exceptions
InterruptedException:
if thread interrupted while waiting
TimeoutException:
if timed out while waiting
badArriveback to summary
private String badArrive(long s)

Returns message string for bounds exceptions on arrival.

badRegisterback to summary
private String badRegister(long s)

Returns message string for bounds exceptions on registration.

bulkRegisterback to summary
public int bulkRegister(int parties)

Adds the given number of new unarrived parties to this phaser. If an ongoing invocation of onAdvance is in progress, this method may await its completion before returning. If this phaser has a parent, and the given number of parties is greater than zero, and this phaser previously had no registered parties, this child phaser is also registered with its parent. If this phaser is terminated, the attempt to register has no effect, and a negative value is returned.

Parameters
parties:int

the number of additional parties required to advance to the next phase

Returns:int

the arrival phase number to which this registration applied. If this value is negative, then this phaser has terminated, in which case registration has no effect.

Exceptions
IllegalStateException:
if attempting to register more than the maximum supported number of parties
IllegalArgumentException:
if parties < 0
doArriveback to summary
private int doArrive(int adjust)

Main implementation for methods arrive and arriveAndDeregister. Manually tuned to speed up and minimize race windows for the common case of just decrementing unarrived field.

Parameters
adjust:int

value to subtract from state; ONE_ARRIVAL for arrive, ONE_DEREGISTER for arriveAndDeregister

doRegisterback to summary
private int doRegister(int registrations)

Implementation of register, bulkRegister.

Parameters
registrations:int

number to add to both parties and unarrived fields. Must be greater than zero.

forceTerminationback to summary
public void forceTermination()

Forces this phaser to enter termination state. Counts of registered parties are unaffected. If this phaser is a member of a tiered set of phasers, then all of the phasers in the set are terminated. If this phaser is already terminated, this method has no effect. This method may be useful for coordinating recovery after one or more tasks encounter unexpected exceptions.

getArrivedPartiesback to summary
public int getArrivedParties()

Returns the number of registered parties that have arrived at the current phase of this phaser. If this phaser has terminated, the returned value is meaningless and arbitrary.

Returns:int

the number of arrived parties

getParentback to summary
public Phaser getParent()

Returns the parent of this phaser, or null if none.

Returns:Phaser

the parent of this phaser, or null if none

getPhaseback to summary
public final int getPhase()

Returns the current phase number. The maximum phase number is Integer.MAX_VALUE, after which it restarts at zero. Upon termination, the phase number is negative, in which case the prevailing phase prior to termination may be obtained via getPhase() + Integer.MIN_VALUE.

Returns:int

the phase number, or a negative value if terminated

getRegisteredPartiesback to summary
public int getRegisteredParties()

Returns the number of parties registered at this phaser.

Returns:int

the number of parties

getRootback to summary
public Phaser getRoot()

Returns the root ancestor of this phaser, which is the same as this phaser if it has no parent.

Returns:Phaser

the root ancestor of this phaser

getUnarrivedPartiesback to summary
public int getUnarrivedParties()

Returns the number of registered parties that have not yet arrived at the current phase of this phaser. If this phaser has terminated, the returned value is meaningless and arbitrary.

Returns:int

the number of unarrived parties

internalAwaitAdvanceback to summary
private int internalAwaitAdvance(int phase, Phaser.QNode node)

Possibly blocks and waits for phase to advance unless aborted. Call only on root phaser.

Parameters
phase:int

current phase

node:Phaser.QNode

if non-null, the wait node to track interrupt and timeout; if null, denotes noninterruptible wait

Returns:int

current phase

isTerminatedback to summary
public boolean isTerminated()

Returns true if this phaser has been terminated.

Returns:boolean

true if this phaser has been terminated

onAdvanceback to summary
protected boolean onAdvance(int phase, int registeredParties)

Overridable method to perform an action upon impending phase advance, and to control termination. This method is invoked upon arrival of the party advancing this phaser (when all other waiting parties are dormant). If this method returns true, this phaser will be set to a final termination state upon advance, and subsequent calls to isTerminated will return true. Any (unchecked) Exception or Error thrown by an invocation of this method is propagated to the party attempting to advance this phaser, in which case no advance occurs.

The arguments to this method provide the state of the phaser prevailing for the current transition. The effects of invoking arrival, registration, and waiting methods on this phaser from within onAdvance are unspecified and should not be relied on.

If this phaser is a member of a tiered set of phasers, then onAdvance is invoked only for its root phaser on each advance.

To support the most common use cases, the default implementation of this method returns true when the number of registered parties has become zero as the result of a party invoking arriveAndDeregister. You can disable this behavior, thus enabling continuation upon future registrations, by overriding this method to always return false:

 Phaser phaser = new Phaser() {
  protected boolean onAdvance(int phase, int parties) { return false; }
};
Parameters
phase:int

the current phase number on entry to this method, before this phaser is advanced

registeredParties:int

the current number of registered parties

Returns:boolean

true if this phaser should terminate

partiesOfback to summary
private static int partiesOf(long s)
phaseOfback to summary
private static int phaseOf(long s)
reconcileStateback to summary
private long reconcileState()

Resolves lagged phase propagation from root if necessary. Reconciliation normally occurs when root has advanced but subphasers have not yet done so, in which case they must finish their own advance by setting unarrived to parties (or if parties is zero, resetting to unregistered EMPTY state).

Returns:long

reconciled state

registerback to summary
public int register()

Adds a new unarrived party to this phaser. If an ongoing invocation of onAdvance is in progress, this method may await its completion before returning. If this phaser has a parent, and this phaser previously had no registered parties, this child phaser is also registered with its parent. If this phaser is terminated, the attempt to register has no effect, and a negative value is returned.

Returns:int

the arrival phase number to which this registration applied. If this value is negative, then this phaser has terminated, in which case registration has no effect.

Exceptions
IllegalStateException:
if attempting to register more than the maximum supported number of parties
releaseWaitersback to summary
private void releaseWaiters(int phase)

Removes and signals threads from queue for phase.

stateToStringback to summary
private String stateToString(long s)

Implementation of toString and string-based error messages.

toStringback to summary
public String toString()

Overrides java.lang.Object.toString.

Returns a string identifying this phaser, as well as its state. The state, in brackets, includes the String "phase = " followed by the phase number, "parties = " followed by the number of registered parties, and "arrived = " followed by the number of arrived parties.

Returns:String

a string identifying this phaser, as well as its state

unarrivedOfback to summary
private static int unarrivedOf(long s)
java.util.concurrent back to summary

pack-priv final Class Phaser.QNode

extends Object
implements ManagedBlocker
Class Inheritance
All Implemented Interfaces
java.util.concurrent.ForkJoinPool.ManagedBlocker

Wait nodes for Treiber stack representing wait queue.

Field Summary

Modifier and TypeField and Description
pack-priv final long
pack-priv final boolean
pack-priv long
pack-priv Phaser.QNode
pack-priv final int
pack-priv final Phaser
pack-priv volatile Thread
pack-priv final boolean
pack-priv boolean

Constructor Summary

AccessConstructor and Description
pack-priv
QNode(Phaser phaser, int phase, boolean interruptible, boolean timed, long nanos)

Method Summary

Modifier and TypeMethod and Description
public boolean
block()

Implements java.util.concurrent.ForkJoinPool.ManagedBlocker.block.

Possibly blocks the current thread, for example waiting for a lock or condition.

public boolean
isReleasable()

Implements java.util.concurrent.ForkJoinPool.ManagedBlocker.isReleasable.

Returns true if blocking is unnecessary.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

deadlineback to summary
pack-priv final long deadline
interruptibleback to summary
pack-priv final boolean interruptible
nanosback to summary
pack-priv long nanos
nextback to summary
pack-priv Phaser.QNode next
phaseback to summary
pack-priv final int phase
phaserback to summary
pack-priv final Phaser phaser
threadback to summary
pack-priv volatile Thread thread
timedback to summary
pack-priv final boolean timed
wasInterruptedback to summary
pack-priv boolean wasInterrupted

Constructor Detail

QNodeback to summary
pack-priv QNode(Phaser phaser, int phase, boolean interruptible, boolean timed, long nanos)

Method Detail

blockback to summary
public boolean block()

Implements java.util.concurrent.ForkJoinPool.ManagedBlocker.block.

Doc from java.util.concurrent.ForkJoinPool.ManagedBlocker.block.

Possibly blocks the current thread, for example waiting for a lock or condition.

isReleasableback to summary
public boolean isReleasable()

Implements java.util.concurrent.ForkJoinPool.ManagedBlocker.isReleasable.

Doc from java.util.concurrent.ForkJoinPool.ManagedBlocker.isReleasable.

Returns true if blocking is unnecessary.