System.currentTimeMillis()不直接计算频率,需结合时间戳差值统计单位时间内次数;常用滑动窗口或定时采样法;注意其受系统时钟影响可能导致时间跳变或倒退。

System.currentTimeMillis() 本身不直接计算频率,它只是返回当前时间毫秒值。要计算业务处理频率(比如每秒处理多少次请求),你需要结合时间戳做差值统计,核心是“单位时间内发生的次数”。
用时间窗口统计请求次数
最常用方式是维护一个滑动窗口或固定周期计数器。例如统计最近 1 秒内处理的请求数:
- 记录每次业务开始/完成时的
System.currentTimeMillis() - 把时间戳存入队列(如
ConcurrentLinkedQueue)或环形数组 - 定期清理超过 1000ms 的旧时间戳(用当前时间减去队列头时间判断)
- 剩余元素数量即为当前 1 秒内的处理次数
简单平均频率(适合低精度场景)
如果只需要粗略频率(如每分钟平均处理量),可定时采样:
- 启动时记录初始时间
start = System.currentTimeMillis()和计数count = 0 - 每次业务完成执行
count++ - 每隔 60 秒(或自定义间隔)计算:
freq = count / ((now - start) / 1000.0) - 重置
start = now、count = 0开始下一轮
注意 System.currentTimeMillis 的局限性
它依赖系统时钟,可能受 NTP 调整、手动修改影响,导致时间跳变:
- 避免用它做精确间隔控制(如定时任务用
ScheduledExecutorService更稳) - 频率计算中若发现时间倒退(当前时间
- 高并发下多次调用
currentTimeMillis()开销极小,但不要在 tight loop 里反复调用(无必要)
更推荐的替代方案
Java 9+ 可用 System.nanoTime() 做更稳定的耗时测量,但它不能表示绝对时间,也不适合跨进程或长时间跨度的频率统计;真正生产级频率监控建议用 Micrometer + Prometheus,自动采集并暴露 counter 或 timer 指标。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











