This
class
synchronizes a group of n threads, where
n is specified to the
CyclicBarrier( ) constructor. Threads call the
await( ) method, which blocks until
n threads are waiting. In the simple case,
all n threads are then allowed to proceed,
and the CyclicBarrier resets itself until it has
another n threads blocked in
await( ).
More complex behavior is possible if you pass a
Runnable object to the
CyclicBarrier constructor. This
Runnable is a "barrier
action" and when the last of the
n threads invokes await(
), that method uses the thread to invoke the run(
) method of the Runnable. This
Runnable is typically used to perform some sort of
coordinating action on the blocked threads. When the run(
) method returns, the CyclicBarrier
allows all blocked threads to resume.
When threads resume from await( ), the return
value of await( ) is an integer that represents
the order in which they called await( ). This is
useful if you want to be able to distinguish between otherwise
identical worker threads. For example, you might have the thread that
arrived first perform some special action while the remaining threads
resume.
If any thread times out or is interrupted while blocked in
await( ), the CyclicBarrier is
said to be "broken," and all
waiting threads (and any threads that subsequently call
await( )) wake up with a
BrokenBarrierException. Waiting threads also
receive a BrokenBarrierException if the
CyclicBarrier is reset( ). The
reset( ) method is the only way to restore a
broken barrier to its initial state. This is difficult to coordinate
properly, however, unless one controller thread is coded differently
from the other threads at the barrier.
public class CyclicBarrier {
// Public Constructors
public CyclicBarrier(int parties);
public CyclicBarrier(int parties, Runnable barrierAction);
// Public Instance Methods
public int await( ) throws InterruptedException, BrokenBarrierException;
public int await(long timeout, TimeUnit unit)
throws InterruptedException, BrokenBarrierException, TimeoutException;
public int getNumberWaiting( );
public int getParties( );
public boolean isBroken( );
public void reset( );
}