高并发下获取系统时间

高并发下获取系统时间

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 高并发下获取系统时间
 * 原理:开启一个定时线程,周期性的取获取系统时间。
 */
public class SystemClock {
    private static final String THREAD_NAME = "system.clock";//线程名称
    private static final SystemClock MILLIS_CLOCK = new SystemClock(1);//饿汉试单例模式
    private final long precision;//线程的循环间隔
    private final AtomicLong now;//系统时间存储

    private SystemClock(long precision) {
        this.precision = precision;
        now = new AtomicLong(System.currentTimeMillis());
        scheduleClockUpdating();
    }

    public static SystemClock millisClock() {
        return MILLIS_CLOCK;
    }

    private void scheduleClockUpdating() {
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> {
            Thread thread = new Thread(runnable, THREAD_NAME);
            thread.setDaemon(true);
            return thread;
        });
        //开启一个周期执行的线程
        scheduler.scheduleAtFixedRate(() ->
                now.set(System.currentTimeMillis()), precision, precision, TimeUnit.MILLISECONDS);
                //线程任务,延迟时间,循环时间,时间类别(毫秒)
    }

    public long now() {
        return now.get();
    }
}
//调用
SystemClock.millisClock().now();

相关文档

你可能感兴趣的:(高并发,时间处理)