package org.emdev.utils.concurrent; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; public class Flag { /** * Running flag. */ private final AtomicBoolean flag; /** * Constructor. */ public Flag() { this(false); } /** * Constructor. * * @param initial * initial value */ public Flag(final boolean initial) { flag = new AtomicBoolean(initial); } /** * @return the current flag value */ public boolean get() { return flag.get(); } /** * Sets the flag. */ public synchronized void set() { if (flag.compareAndSet(false, true)) { this.notifyAll(); } } /** * Clears the flag. */ public synchronized void clear() { if (flag.compareAndSet(true, false)) { this.notifyAll(); } } /** * Waits for flag changes. * * @param unit * time unit * @param timeout * timeout to wait * @return the flag value */ public synchronized boolean waitFor(final TimeUnit unit, final long timeout) { try { unit.timedWait(this, timeout); } catch (final InterruptedException ex) { Thread.interrupted(); } return get(); } public synchronized void notifyWaiters() { notifyAll(); } }