From 0e587eda79a09cfe76148a347ae9b99392610334 Mon Sep 17 00:00:00 2001 From: sun Date: Tue, 21 Feb 2023 20:14:48 +0800 Subject: [PATCH] perf[time]: improve the precision of the now() method --- .../main/java/com/zfoo/scheduler/manager/SchedulerBus.java | 5 +++-- .../src/main/java/com/zfoo/scheduler/util/TimeUtils.java | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java index 754eeaa9..d027d8e6 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java @@ -55,7 +55,6 @@ public abstract class SchedulerBus { private static long lastTriggerTimestamp = 0L; - public static final long TRIGGER_MILLIS_INTERVAL = TimeUtils.MILLIS_PER_SECOND; /** * 在scheduler中,最小的triggerTimestamp */ @@ -68,7 +67,9 @@ public abstract class SchedulerBus { } catch (Exception e) { logger.error("scheduler triggers an error.", e); } - }, 0, TRIGGER_MILLIS_INTERVAL, TimeUnit.MILLISECONDS); + }, 0, TimeUtils.MILLIS_PER_SECOND, TimeUnit.MILLISECONDS); + + executor.scheduleAtFixedRate(TimeUtils::currentTimeMillis, 0, 20, TimeUnit.MILLISECONDS); } public static class SchedulerThreadFactory implements ThreadFactory { diff --git a/scheduler/src/main/java/com/zfoo/scheduler/util/TimeUtils.java b/scheduler/src/main/java/com/zfoo/scheduler/util/TimeUtils.java index 76bca3bf..4c4a4298 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/util/TimeUtils.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/util/TimeUtils.java @@ -31,8 +31,6 @@ import java.util.TimeZone; */ public abstract class TimeUtils { - private static long timestamp = System.currentTimeMillis(); - // 一秒钟对应的纳秒数 public static final long NANO_PER_SECOND = 1_000_000_000; // 一秒钟对应的毫秒数 @@ -85,6 +83,8 @@ public abstract class TimeUtils { SchedulerBus.refreshMinTriggerTimestamp(); } + private static volatile long timestamp = System.currentTimeMillis(); + /** * 获取精确的时间戳 */ @@ -94,7 +94,7 @@ public abstract class TimeUtils { } /** - * 获取最多只有一秒延迟的粗略时间戳,适用于对时间精度要求不高的场景,最多只有一秒误差 + * 获取最多只有20ms延迟的粗略时间戳,适用于对时间精度要求不高的场景,最多只有20ms误差 *

* 比System.currentTimeMillis()的性能高10倍 */