在TimerTask的run()方法里使用sleep()方法后出现的奇怪想象

bobokong 2005-12-05 12:45:49
有这样一个小程序
01 import java.util.*;
02 public class Test extends TimerTask {
03
04 public void run() {
05 System.out.println("run... start->" + new Timestamp(System.currentTimeMillis()));
06 try {
07 Thread.sleep(10);
08 } catch (Exception e) {
09 System.out.println(e.getMessage());
10 }
11 System.out.println("run... end ->" + new Timestamp(System.currentTimeMillis()));
12 System.out.println("");
13 }
14
15 public static void main(String[] args) {
16 try {
17 Timer t = new Timer();
18 t.schedule(new Test(), 0, 1000);
19
20 } catch (Exception e) {
21 e.printStackTrace();
22 } finally {
23
24 }
25
26 }
27 }

大致的功能就是每隔1秒执行一下run(),输出一些log,但是当我在run()方法里使用了Thread.sleep()后发现刚开始执行的一次时间间隔好像不对(间隔时间长了),而且我只sleep 10ms,但是从log看每次都sleep 16ms,log如下:
run... start->2005-12-05 11:36:17.375
run... end ->2005-12-05 11:36:17.406

run... start->2005-12-05 11:36:18.39
run... end ->2005-12-05 11:36:18.406

run... start->2005-12-05 11:36:19.39
run... end ->2005-12-05 11:36:19.406

run... start->2005-12-05 11:36:20.39
run... end ->2005-12-05 11:36:20.406

如果我把第6-10行注释了,执行间隔时间就完全正常了,log如下:
run... start->2005-12-05 11:35:41.5
run... end ->2005-12-05 11:35:41.5

run... start->2005-12-05 11:35:42.5
run... end ->2005-12-05 11:35:42.5

run... start->2005-12-05 11:35:43.5
run... end ->2005-12-05 11:35:43.5

run... start->2005-12-05 11:35:44.5
run... end ->2005-12-05 11:35:44.5

我实在不明白TimerTask的run()里面使用sleep()后出现的现象,哪位大虾知道原因?
...全文
624 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sole_eagle 2005-12-08
  • 打赏
  • 举报
回复
sleep 可以保证你用的时间多于10ms,没有说一定是这么多,如果线程多的话可能时间会更多。
bobokong 2005-12-07
  • 打赏
  • 举报
回复
bobokong 2005-12-06
  • 打赏
  • 举报
回复
再顶
xpzheng 2005-12-06
  • 打赏
  • 举报
回复
关注中。。。
学习
Mark_Chen 2005-12-06
  • 打赏
  • 举报
回复
关注中....
up!
bobokong 2005-12-05
  • 打赏
  • 举报
回复
自己顶一下
bobokong 2005-12-05
  • 打赏
  • 举报
回复
那不考虑sleep的精度,但是我用的是schedule(),从输出信息看
run... start->2005-12-05 11:36:18.39
run... end ->2005-12-05 11:36:18.406

run... start->2005-12-05 11:36:19.39
run... end ->2005-12-05 11:36:19.406
每次结束时间和下一次开始时间之间并不是1秒,而是0.984秒,而从输出信息来看这个更像是用了scheduleAtFixedRate()后的结果。

我现在做的项目里有不少需要使用TimerTask定期执行的程序,我主要想知道在TimerTask的run()方法里使用sleep会不会有什么问题,会不会破坏原来schedule定下来的间隔时间。
ChDw 2005-12-05
  • 打赏
  • 举报
回复
t.scheduleAtFixedRate(new Test(), 0, 1000);可以保证两次开始时间保持指定的间隔
schedule是保证这一次结束到下一次开始的间隔




另外Sleep并不是精确控制的,与操作系统有关
kingfish 2005-12-05
  • 打赏
  • 举报
回复
sleep()精度问题

NT内核的系统时钟中断大概就16ms

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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