各路大侠,下代码中,为什么注释和不注释会出现两种不同的结果。虽然 sleep 是个静态方法,但 java 允许用实例来调用,所以可以出现这样的写法,所以也请大侠们说一下这段代码的含义。谢谢!public class ThreadAsk { public static void main(String[] args) {

DThread t = new DThread();
DThread t2 = new DThread();

t.setName("t");
t2.setName("t2");

try{

t.start();
// 这句话注释前后有区别谁能解释下
t.sleep(1000);
t2.start();
}catch(InterruptedException ex){
System.out.println(ex.getMessage());
}

}}class DThread extends Thread{ public void run() {
int count = 0;
do{
try{
System.out.println(Thread.currentThread().getName());
Thread.sleep(100);
}
catch(InterruptedException ex){
count++;
}
count++;

}while(count < 10);
}
}

解决方案 »

  1.   

    补充一下,不注释的结果是
    t
    t
    t
    t
    t
    t
    t
    t
    t
    t
    t2
    t2
    t2
    t2
    t2
    t2
    t2
    t2
    t2
    t2注释的结果是
    t
    t2
    t2
    t
    t2
    t
    t2
    t
    t2
    t
    t2
    t
    t2
    t
    t2
    t
    t2
    t
    t2
    t
      

  2.   

    线程执行是随机的,sleep的时间,执行更是不确定性了
      

  3.   

      t.start();
                // 这句话注释前后有区别谁能解释下
                t.sleep(1000);
                t2.start();
    DThread类其实只 sleep 了1/10 秒,
    t 与 t2 只是 DThread类的两个实例对象,

      
    t      t 启动执行,sleep 一秒
    t2     t2启动执行,
    t2     t2执行, sleep 1/10秒
    t      t 执行 sleep 1/10秒
    t2     t2执行,sleep 1/10秒
        依次类推
      

  4.   

    对的,线程是随意的,也就是进行任务的执行时,也有先后的排序呀!如果认识这一点的话,就好解释啦!对于当个任务的执行的话,那样t2的执行任务就要放在缓1000MS呀,所以一个任务的以次执行,就是进行单任务的执行,就可以一步步的来啦!
      

  5.   

    线程是随机的执行的,在CPU的调用是随机,当sleep()后,就消除了这种随机性,应一个休眠了不参加CPU的随机调用,另一个仍人使用着CPU的时间片。
      

  6.   

    t.sleep(10000)是个幌子,看起来貌似是线程t会挂起,其实是把main线程挂起了。所以出现这种结果完全是对的啊。
      

  7.   

    楼上已经回复好多了,我就不多少的指出一点,sleep是个静态方法,最好是用Thread.sleep();这样比较好。