/* * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to the public domain, as explained at * http://creativecommons.org/licenses/publicdomain */ package jsr166y.forkjoin; import java.util.concurrent.atomic.*; /** * Maintains lifecycle control for pool and workers. * Opportunistically subclasses AtomicInteger. Don't directly use the * AtomicInteger methods though. */ final class RunState extends AtomicInteger { // Order among values matters static final int RUNNING = 0; static final int SHUTDOWN = 1; static final int STOPPING = 2; static final int TERMINATED = 4; boolean isRunning() { return get() == RUNNING; } boolean isShutdown() { return get() == SHUTDOWN; } boolean isStopping() { return get() == STOPPING; } boolean isTerminated() { return get() == TERMINATED; } boolean isAtLeastShutdown() { return get() >= SHUTDOWN; } boolean isAtLeastStopping() { return get() >= STOPPING; } boolean transitionToShutdown() { return transitionTo(SHUTDOWN); } boolean transitionToStopping() { return transitionTo(STOPPING); } boolean transitionToTerminated() { return transitionTo(TERMINATED); } /** * Transition to at least the given state. Return true if not * already at least given state. */ private boolean transitionTo(int state) { for (;;) { int s = get(); if (s >= state) return false; if (compareAndSet(s, state)) return true; } } }