public class ShutdownHook {
private static final ShutdownHook INSTANCE = new ShutdownHook();
private List<ExecutorService> executorServices = Lists.newArrayList();
private AtomicBoolean closed = new AtomicBoolean(false);
public static ShutdownHook getInstance() {
return INSTANCE;
}
private ShutdownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
shutdown();
}
});
}
@PreDestroy
public void shutdown() {
if (!closed.compareAndSet(false, true)) {
return;
}
for (ExecutorService executorService : executorServices) {
tryShutdownNow(executorService);
}
}
private void tryShutdownNow(ExecutorService executorService) {
try {
executorService.shutdownNow();
} catch (Throwable e) {
//ignore logger maybe has been destroyed
}
try {
executorService.awaitTermination(1, TimeUnit.SECONDS);
} catch (InterruptedException e) {
//ignore logger maybe has been destroyed
}
}
/**
* 注册executorService
*
* @param executorService
*/
public ExecutorService register(ExecutorService executorService) {
this.executorServices.add(executorService);
return executorService;
}
}