package com.aps.common.core.enums; import java.sql.Timestamp; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; /** * System Clock *

* 利用ScheduledExecutorService实现高并发场景下System.curentTimeMillis()的性能问题的优化. * * @author lry */ public enum SystemClock { // ==== INSTANCE(1); private final long period; private final AtomicLong nowTime; private boolean started = false; private ScheduledExecutorService executorService; SystemClock(long period) { this.period = period; this.nowTime = new AtomicLong(System.currentTimeMillis()); } /** * The initialize scheduled executor service */ public void initialize() { if (started) { return; } this.executorService = new ScheduledThreadPoolExecutor(1, r -> { Thread thread = new Thread(r, "system-clock"); thread.setDaemon(true); return thread; }); executorService.scheduleAtFixedRate(() -> nowTime.set(System.currentTimeMillis()), this.period, this.period, TimeUnit.MILLISECONDS); Runtime.getRuntime().addShutdownHook(new Thread(this::destroy)); started = true; } /** * The get current time milliseconds * * @return long time */ public long currentTimeMillis() { return started ? nowTime.get() : System.currentTimeMillis(); } /** * The get string current time * * @return string time */ public String currentTime() { return new Timestamp(currentTimeMillis()).toString(); } /** * The destroy of executor service */ public void destroy() { if (executorService != null) { executorService.shutdown(); } } }