/** * Implementing classes should invoke this method once their service has started. It will cause * the service to transition from {@link State#STARTING} to {@link State#RUNNING}. * * @throws IllegalStateException if the service is not {@link State#STARTING}. */ protected final void notifyStarted() { lock.lock(); try { if (state != State.STARTING) { IllegalStateException failure = new IllegalStateException("Cannot notifyStarted() when the service is " + state); notifyFailed(failure); throw failure; } running(); if (shutdownWhenStartupFinishes) { stop(); } else { startup.set(State.RUNNING); } } finally { lock.unlock(); } }