有这样一个小程序
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.406run... start->2005-12-05 11:36:18.39
run... end  ->2005-12-05 11:36:18.406run... start->2005-12-05 11:36:19.39
run... end  ->2005-12-05 11:36:19.406run... 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.5run... start->2005-12-05 11:35:42.5
run... end  ->2005-12-05 11:35:42.5run... start->2005-12-05 11:35:43.5
run... end  ->2005-12-05 11:35:43.5run... start->2005-12-05 11:35:44.5
run... end  ->2005-12-05 11:35:44.5我实在不明白TimerTask的run()里面使用sleep()后出现的现象,哪位大虾知道原因?

解决方案 »

  1.   

    sleep()精度问题NT内核的系统时钟中断大概就16ms
      

  2.   

    t.scheduleAtFixedRate(new Test(), 0, 1000);可以保证两次开始时间保持指定的间隔
    schedule是保证这一次结束到下一次开始的间隔
    另外Sleep并不是精确控制的,与操作系统有关
      

  3.   

    那不考虑sleep的精度,但是我用的是schedule(),从输出信息看
    run... start->2005-12-05 11:36:18.39
    run... end  ->2005-12-05 11:36:18.406run... 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定下来的间隔时间。
      

  4.   

    sleep 可以保证你用的时间多于10ms,没有说一定是这么多,如果线程多的话可能时间会更多。