package com.hubspot.blazar.util; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.ThreadFactoryBuilder; import io.dropwizard.lifecycle.Managed; import javax.inject.Provider; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; public class ManagedScheduledExecutorServiceProvider implements Provider<ScheduledExecutorService>, Managed { private final ScheduledExecutorService service; private final AtomicBoolean stopped; public ManagedScheduledExecutorServiceProvider(int threads, String name) { ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(name + "-pool-%d").setDaemon(true).build(); this.service = Executors.newScheduledThreadPool(threads, threadFactory); this.stopped = new AtomicBoolean(); } @Override public void start() {} @Override public ScheduledExecutorService get() { Preconditions.checkState(!stopped.get(), "Already stopped"); return service; } @Override public void stop() throws InterruptedException { if (stopped.compareAndSet(false, true)) { service.shutdown(); service.awaitTermination(5, TimeUnit.SECONDS); } } }