package jenkins.util;
import hudson.util.DaemonThreadFactory;
import hudson.util.NamingThreadFactory;
import javax.annotation.Nonnull;
import java.util.concurrent.ScheduledExecutorService;
/**
* Holds the {@link ScheduledExecutorService} for running all background tasks in Jenkins.
* This ExecutorService will create additional threads to execute due (enabled) tasks.
*
* Provides a minimal abstraction for locating the ScheduledExecutorService so that we
* can modify it's behavior going forward. For instance, to add manageability/monitoring.
*
* This is not an @Extension because it must be available before any extensions are loaded.
*
* Plugins should probably use one of the following as they provide higher level abstractions:
* {@link hudson.model.AperiodicWork}, {@link hudson.model.PeriodicWork},
* {@link hudson.model.AsyncAperiodicWork}, {@link hudson.model.AsyncPeriodicWork}.
*
* @author Ryan Campbell
* @since 1.541
*/
public class Timer {
/**
* The scheduled executor thread pool. This is initialized lazily since it may be created/shutdown many times
* when running the test suite.
*/
private static ScheduledExecutorService executorService;
/**
* Returns the scheduled executor service used by all timed tasks in Jenkins.
*
* @return the single {@link ScheduledExecutorService}.
*/
@Nonnull
public static synchronized ScheduledExecutorService get() {
if (executorService == null) {
// corePoolSize is set to 10, but will only be created if needed.
// ScheduledThreadPoolExecutor "acts as a fixed-sized pool using corePoolSize threads"
executorService = new ErrorLoggingScheduledThreadPoolExecutor(10, new NamingThreadFactory(new DaemonThreadFactory(), "jenkins.util.Timer"));
}
return executorService;
}
/**
* Shutdown the timer and throw it away.
*/
public static synchronized void shutdown() {
if (executorService != null) {
executorService.shutdownNow();
executorService = null;
}
}
/**
* Do not create this.
*/
private Timer() {};
}