我在继承自Thread的类T中定义了一个s()方法,在类r的main()方法中,声明了一个T 实例变量g,并调用g.start()方法,然后再调用g.s()方法,为什么执行时先输出s中内容后输出run()中内容?而我在g.start()后添加sleep()方法后,输出结果却反过来了,这是为什么?请各位大侠指点:
public class r{
    public static void main(String[] args)
    {
         T g=new T();
        g.start();
    /*    try{
            g.sleep(10);
        }catch(InterruptedException e){
            System.out.print("exception!");
        }*/
        g.s();
    
    }
}
class T extends Thread{
    private int a;
    public T(){
        a=0;    }
    public void run(){
        a=a+10;
        System.out.print("123");        
    }
    public void s(){
        a++;
        
        System.out.print("fdaksfhskakjjksd");
    }
}

解决方案 »

  1.   

    不为什么。
    g.start();
    只是告诉系统说:“现在线程对象g已经就绪了,你随时可以调度它。”,而并不是告诉系统:“你他妈马上把我停下来,把别的线程都停下来,调度g运行,听见没有!”^_^。
      

  2.   

    g.start();并不是马上执行,设计到系统线程调度问题
      

  3.   

    g.sleep(10); 这一句有问题,
    Thread类的sleep()方法是个静态方法,作用是让当前的线程暂停指定的时间
    在你的程序中就是让运行main方法的这个线程暂停了10毫秒,而不是让线程g暂停10毫秒
    你把当前的线程暂停了10毫秒然后再运行s方法,这时候g没有被暂停,他的run()方法当然更有可能先被执行了.
    如果你把10改成大一些的数,比如1000,就更容易看出来到底g.sleep()是把哪个线程暂停了.
      

  4.   

    steedhorse(晨星) 
    说得通俗易懂!
      

  5.   

    steedhorse(晨星)大虾描述的真形象,小弟先谢谢了!