System.currentTimeMillis()用于任务耗时测量,核心是记录开始时间、执行任务、计算差值;返回UTC毫秒时间戳,精度毫秒,适合短至数小时任务;需用long存起始时间,避免int溢出;注意系统时间跳变影响精度,高精度场景应选System.nanoTime()。

用 System.currentTimeMillis() 记录任务处理间隔,核心是“记录开始时间 → 执行任务 → 计算结束时间与开始时间的差值”。它返回的是自 1970 年 1 月 1 日 00:00:00 UTC 起的毫秒数,精度为毫秒,适合测量短到中等时长(几毫秒到数小时)的任务耗时。
获取并保存起始时间
在任务开始前调用一次 System.currentTimeMillis(),把结果存入一个 long 类型变量:
- 推荐命名如
startTime或startMs,语义清晰 - 不要用
int存储,避免溢出(毫秒值约每 24.8 天就超过Integer.MAX_VALUE) - 确保该变量作用域覆盖整个任务执行过程(例如方法内局部变量即可)
执行业务逻辑
中间部分就是你原本要做的任务,比如处理请求、读写文件、调用接口等。不需要额外操作,也不建议在此期间再次调用 currentTimeMillis() 做中间计时(除非你有分段统计需求)。
计算并使用耗时差值
任务完成后,再次调用 System.currentTimeMillis(),减去起始时间,得到以毫秒为单位的耗时:
立即学习“Java免费学习笔记(深入)”;
long elapsed = System.currentTimeMillis() - startTime;- 可直接用于日志打印:
log.info("Task completed in {} ms", elapsed); - 可用于条件判断,例如超时控制:
if (elapsed > 5000) { /* 超过 5 秒 */ } - 如需秒级显示,除以 1000.0 并保留小数:
double seconds = elapsed / 1000.0;
注意事项和常见误区
虽然简单,但几个细节容易影响准确性或引发问题:
- 系统时间可能被手动或 NTP 同步调整,导致
currentTimeMillis()出现跳变(向前或向后),不适合高精度或跨长时间的稳定性要求场景(此时应考虑System.nanoTime()) - 不要在循环中高频调用它来“打点”,尤其在微秒级敏感场景下,其本身有一定开销(虽小但非零)
- 注意时区无关性:它基于 UTC,不随本地时区变化,适合做差值计算,无需转换
- 多线程环境下,每个任务应独立记录自己的
startTime,避免共享变量引发混乱


















