★★★用ntp时间同步之后,Thread.sleep睡眠时间不对★★★

wuzhixuexi 2010-11-27 07:34:48
ntp时间同步之前,调用线程sleep(xxxxxxx),预计是凌晨03:00的时候sleep结束线程被唤醒。
但是在凌晨01:00左右进行ntp时间同步之后系统时间出现了10几秒的误差,
这个之后线程居然在02:50分就被唤醒了。

我不太明白为什么ntp只是出现了10来秒的误差,现成的sleep方法会出来10分钟左右的
误差呢。
...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zabaglione 2011-01-22
  • 打赏
  • 举报
回复
看看不知道啥原因阿
wuzhixuexi 2010-12-02
  • 打赏
  • 举报
回复
我用windows作ntpserver,linux作ntpclient
也没有发生这样的问题啊。有没有高手可以解答一下
wuzhixuexi 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 magong 的回复:]
引用 3 楼 magong 的回复:

把一个长长的sleep拆成若干短的sleep,循环来。

怀疑你中途调整时间对那个已经进入的sleep可能没作用。

仔细想想觉得这个点子其实也不够。还要在短sleep之间监测系统时间。
即:
用时间查询来决定是否到达时间,而不是依赖sleep自己的计时。
(这样你调整系统时间才具有了现实意义)
[/Quote]
嗯,谢谢你,这个方法确实很好,可以解决这个问题。

解决之前,我想知道是什么原因造成的。为什么ntp只调整了10来秒,但是sleep误差达到了5分钟
这个不太明白原因
我目前用
windows作ntpserver
linux作ntpclient
正在试验看看
magong 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 magong 的回复:]

把一个长长的sleep拆成若干短的sleep,循环来。

怀疑你中途调整时间对那个已经进入的sleep可能没作用。
[/Quote]
仔细想想觉得这个点子其实也不够。还要在短sleep之间监测系统时间。
即:
用时间查询来决定是否到达时间,而不是依赖sleep自己的计时。
(这样你调整系统时间才具有了现实意义)
wuzhixuexi 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 magong 的回复:]
把一个长长的sleep拆成若干短的sleep,循环来。

怀疑你中途调整时间对那个已经进入的sleep可能没作用。
[/Quote]
sleep是按照毫秒单位计时的,ntp调整的是系统时间。
我觉得sleep一旦设置了睡眠的毫秒数就应该和ntp没有啥关系了阿。。。。
我就是弄不明白,那多出来的5分钟是怎么出来的。。。
magong 2010-11-27
  • 打赏
  • 举报
回复
把一个长长的sleep拆成若干短的sleep,循环来。

怀疑你中途调整时间对那个已经进入的sleep可能没作用。
wuzhixuexi 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 magong 的回复:]
计算机时钟本来就不准,LZ多长时间误差了10分钟?
[/Quote]
因为业务上面的需要,线程必须sleep 18个小时。
就用18*60*60 = 64800秒来设置的,因为sleep设置毫秒级别
所以就变成了sleep(64800000)

比如早晨
11/27 08:00:00开始执行sleep
11/28 02:00:00预计唤醒sleep
但是在11/28 01:00左右有了一个ntp的时间同步处理,这个时候
把系统时间向前调了10来秒,按道理sleep也只误差10来秒才对,
但是我发现sleep误差了5分钟左右
在11/28 01:55:00就被唤醒了
不知道什么原因
magong 2010-11-27
  • 打赏
  • 举报
回复
计算机时钟本来就不准,LZ多长时间误差了10分钟?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧