如这个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()做定时调度实现的。

讨论中给出了两个建议:

  1. 依赖System.nanoTime(),这个API返回的值不会受系统时间变化的影响。我能想到的是通过这个来衡量是否发生大幅度时间变化,并计算偏移量来进行修正,当然依旧无法避免卡住的问题;
  2. 依赖外部不受影响的命令,例如sleep命令