系统时间变化对Java系列API的影响
如这个SO问题所讨论的,当系统时间被修改时,多个Java API会受到影响:当时间向过去调整,这些API的调用会出现类似hang住的情况:
- Thread.sleep(long)
- Thread.sleep(long, int)
- Object.wait(long)
- Object.wait(long, int)
- Thread.join(long)
- Thread.join(long, int)
- LockSupport.parkNanos(long)
- java.util.Timer
- javax.swing.Timer
因为这些都是依赖System.currentTimeMillis()
做定时调度实现的。
讨论中给出了两个建议:
- 依赖
System.nanoTime()
,这个API返回的值不会受系统时间变化的影响。我能想到的是通过这个来衡量是否发生大幅度时间变化,并计算偏移量来进行修正,当然依旧无法避免卡住的问题; - 依赖外部不受影响的命令,例如
sleep
命令;