System.nanoTime()比Thread.sleep()更可靠,因其提供纳秒级单调时间戳,不受系统时钟调整影响;而Thread.sleep()受OS调度粒度限制,精度低且易超时;推荐采用sleep+busy-wait混合策略实现高精度延迟。

Java中实现精确延迟,System.nanoTime() 是比 Thread.sleep() 更可靠的选择,尤其在需要毫秒级甚至亚毫秒级控制的场景(如游戏循环、高频采样、实时任务调度)中。它不受系统时钟调整影响,返回的是单调递增的纳秒级时间戳,适合做高精度时间差计算。
为什么不用Thread.sleep()?
Thread.sleep() 精度受限于操作系统调度粒度(Windows通常10–15ms,Linux可能更优但仍有抖动),且实际休眠时间可能显著长于指定值;而 System.nanoTime() 提供纳秒级分辨率(实际精度取决于硬件和JVM,通常为微秒级),配合忙等待(busy-wait)或混合策略,可将延迟误差压缩到几十微秒内。
基础精确延迟实现(忙等待)
适用于延迟较短(如≤10ms)、CPU资源可控的场景。核心逻辑:记录起始时间 → 循环检查已过时间 → 达到目标后退出。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 用 long start = System.nanoTime(); 记录起点
- 目标延迟设为 long delayNs = TimeUnit.MILLISECONDS.toNanos(5);
- 循环中用 System.nanoTime() - start < delayNs 判断是否超时
- 为降低CPU占用,可在循环内插入 Thread.yield() 或短休眠(如1μs)
混合策略:sleep + busy-wait(推荐)
兼顾效率与精度:先用 Thread.sleep() 接近目标时间(如提前1–2ms),再用 nanoTime 精确补足剩余延迟。这样避免全程忙等待耗尽CPU,又规避了纯sleep的不确定性。
立即学习“Java免费学习笔记(深入)”;
- 计算粗略休眠时间:long coarseMs = Math.max(0, delayMs - 2);
- 调用 Thread.sleep(coarseMs)
- 立即记录 long start = System.nanoTime();
- 忙等待剩余纳秒:while (System.nanoTime() - start < (delayMs - coarseMs) * 1_000_000)
注意事项与边界情况
实际使用需警惕几个关键点:
- 不要直接用 System.currentTimeMillis() 做差值——它可能被NTP校准跳变,导致负延迟或长时间阻塞
- 避免在循环中频繁调用 System.nanoTime()(现代JVM优化较好,但过度调用仍增加开销)
- JVM预热会影响首次nanoTime调用性能,建议在稳定运行后再启用高精度逻辑
- 多核环境下,不同线程读取nanoTime无一致性保证,但单线程内差值始终可靠

















