Thread.sleep(1000);
按照楼主的想法这句应该改成Thread.currentThread().sleep(1000);

解决方案 »

  1.   

    程序并不是按照你想的方式运行!
    main线程和你产生的线程是轮流共享cpu,它们何时该谁运行并不知道,不可能是你想的那样输出再1000左右!
      

  2.   

    这个可能和实际环境有关
    你要注意,在调用start时,JVM启动一个新的线程,但是这个是需要花费时间的,所以到进入run方法已经过了好一会儿了
      

  3.   

    楼上说的不太对吧,启动线程的时间可以忽略的。而且我用的是
    wait(1)在一个毫秒内肯定能轮到该线程占用cpu的。
    每次运行这个程序都是输出64,不太像是随机的。
      

  4.   

    我的机器上执行了多次,大概在7xx--9xx另外,有一点要改
    volatile boolean flag = true;
    ========
    这个就不用解释了吧另外,考虑到线程启动需要时间,需要中其它指令的时间,8xx-9xx比较正常.
      

  5.   

    果然改为volatile boolean 输出就有500多了
      

  6.   

    另外,考虑到线程启动需要时间,需要中其它指令的时间,8xx-9xx比较正常
                                ====
                                循环
      

  7.   

    一。系统中的时钟是不可能十分准确的
    呵呵 这个归功于 当时ibm设计pc的时候的计时方式,即时钟中断。这个中断每秒大约产生18次(55ms一次).
    DOS以后的操作系统吧他继承下来了。
    二。你的程序执行的时候也占用了一定的时间,而且windows系统是一个多线程的抢占式系统。这会使你的程序不会完全占用系统的cpu也就无法准确的计数。
      

  8.   

    import java.util.*;class Task extends TimerTask {
      int a = 0;
      public void run() {
       a++;
      }
      public int getCnt() {
       return a;
      }
    }public class Test {
      public static void main(String[] args) throws Exception {
        Timer tm = new Timer();
        Task tsk = new Task();
        tm.scheduleAtFixedRate(tsk, 0, 1);
        Thread.sleep(1000);
        tm.cancel();
        System.out.println(tsk.getCnt());
      }
    }用Timer类实现计时就可以输出1001,都是用Object.wait(long t)来实现的,类库实现者就是
    强啊。而且Timer sched函数代码比我的多很多,附加的时间因该更多呀,不知道为什么他们能做
    到如此的“实时性”。
      

  9.   

    楼上 不要忘了 java系统的底层 是用c实现的
      

  10.   

    不是的,Timer类是完全用java代码实现的,我看过没有用native 方法的。
      

  11.   

    Timer类是做了一个任务队列来pooling的, 队列采用wait/notify, 
    我想这比wait(1)更准确.
      

  12.   

    我还没完全看懂Timer 的代码,我发现这个类的代码不多, 多花点时间应该能看懂^_^
      

  13.   

    Object o = new Object();
        long start = 0;
        start = System.currentTimeMillis();
        synchronized (o) {
          for (int i = 0; i < 1000; ++i) {
            o.wait(1);
          }
        }
        System.out.println(System.currentTimeMillis() - start);以我本机为例:
    大概耗时 1090ms, 所以wait(1)的时间大概1.09ms
    那么1000/1.09=917 
    和我运行第一个程序的值非常接近.