import java.util.Random;public class Test2 { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
        long time1=1,time2=1;
        time1=time1();
try{
Thread.sleep(2000);
}catch(Exception e){
}
    Test2 t=new Test2();
        time2=t.time2();
System.out.println(time2-time1);

}
public static long time1(){
long time = System.currentTimeMillis();
return time;
}
public long time2(){
long time = System.currentTimeMillis();
return time;
}
} 直接运行的话,结果为0,而debug一步一步的执行直至完毕的话结果就不为0了!!
这是什么原因,这些代码块在内存中是如何加载执行的?哪个高手能解释一下?

解决方案 »

  1.   

    不光是线程sleep的时间,而且还有后续代码运行占用的时间,所以应该是2000+,因为毕竟还有操作系统调用的时间嘛。
      

  2.   

    我也执行了下,是2000,把Test2 t=new Test2();
     time2=t.time2();换成time2 = time1();也是2000
      

  3.   


    结果为0可能是sleep失败了。一步一步执行时,两次取当前时间肯定是由你来控制了,你一步一步按的慢了,当然差的就多了。而直接执行时,速度基本在固定。
      

  4.   

    线程调用是jvm去做的,什么结果都有可能
      

  5.   

    LZ的那个0出现的太诡异了程序运行过程中,通过Thread.sleep(2000)休眠了2秒,所以啊,LZ你那个0到底是怎么出来的呀? 我试了N+1次都出不来0....
      

  6.   

    2000,我没改配置,是双核的,运行线程建议把双核的CPU改成用一个。
      

  7.   

    我的夜是 2000 ,2012的话还可以解释成是 Test2 t = new Test2();
    time2 = t.time2();这两句占用的时间 ,可是 0 就难以理解了 是不是
    两个取时间 一个用静态 一个用非静态的 ? 改改看 还会不会有问题
      

  8.   

    睡了2秒  怎么也得大于2000  楼主把time2方法也改为静态的试试~
      

  9.   

    多线程涉及到CPU的分片时间,不是很精确的,你可以多试几次
      

  10.   

    关于你出0的情况下、我相信估计是你说错了,
    关于调试产生结果不一样的问题,因为System.currentTimeMillis();取的是当前毫秒时间,
    当你在调试的时候时间也在流逝、直到运行到第二个System.currentTimeMillis();的时候、这个当前毫秒时间已经不能固定了,所以导致这样一个问题