public class TT implements Runnable{
int b = 100;

public void m1() throws Exception{
b = 1000;
Thread.sleep(5000);
System.out.println("b="+b);
}

public void m2() throws Exception{
b = 2000;
Thread.sleep(500);
System.out.println(b);
}

public void run(){
try{
m1();
}catch(Exception e){

}

}
public static void main(String args[]) throws Exception{
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
}
}执行结果是多少?
为什么是这个结果,我百思不得其解!

解决方案 »

  1.   


    public class TT implements Runnable{
    int b = 100;

    public  void m1() throws Exception{
    b = 1000;
    Thread.sleep(500);
    System.out.println("b="+b);
    }

    public void m2() throws Exception{
    b = 2000;
    Thread.sleep(3000);
    System.out.println(b);
    }

    public void run(){
    try{
    m1();
    }catch(Exception e){

    }

    }
    public static void main(String args[]) throws Exception{
    TT tt = new TT();
    Thread t = new Thread(tt);

    t.start();tt.m2();

    }
    }
    这个答案又是多少呢?
      

  2.   

    很有意思啊,m2()sleep了所以B的值才没有变。。
      

  3.   

    你启动一个线程的时候,这个新的线程并不一定马上运行.
    程序里有两个线程,本身的main方法的线程main,然后里边还有一个线程t首先是执行main线程,虽然对t进行了start调用,它当前的时间还没有用完,接着马上进入tt对象的方法m2,此时main线程锁住了对象tt,线程t再启动的时候,它无法进入m1()方法.只能是等m2方法执行完,才能执行m1方法public static void main(String args[]) throws Exception{
    TT tt = new TT();
    Thread t = new Thread(tt);
    t.start();//在此处加一定延迟的话,就会是t线程先执行了
    tt.m2();
    }
    }
      

  4.   

    本帖最后由 AWUSOFT 于 2011-04-27 23:37:39 编辑
      

  5.   

    执行顺序:
    1.主线程m2()执行,b=2000,休眠200ms
    2.线程t执行,b=1000,休眠5s
    3.主线程m2()继续执行,打印b,b为1000
    4.线程t2继续执行打印b=1000结果:1000
          b=1000第二题类似
      

  6.   

    很有意思啊,m2()sleep了所以B的值才没有变。。
      

  7.   

    以你的第一个例子为例,首先你要了解线程是什么,MAIN执行后,当到线程的时候,去执行线程,同时继续向下执行,若遇到的不是线程,而是调用方法,那就是等方法执行完后再向下执行,由于m1()的睡眠时间长,m2()方法先执行完,故先输出,再等mi()执行完输出
      

  8.   


    public class TT implements Runnable{
    int b = 100;public void m1() throws Exception{
    b = 1000;
    System.out.println("m1");
    Thread.sleep(5000);
    System.out.println("b="+b);
    }public void m2() throws Exception{
    b = 2000;
    System.out.println("m2");
    Thread.sleep(500);
    System.out.println(b);
    }public void run(){
    try{
    m1();
    }catch(Exception e){}}
    public static void main(String args[]) throws Exception{
    TT tt = new TT();
    Thread t = new Thread(tt);t.start();
    tt.m2();
    }
    }
    得出的输出是:
    m2
    m1
    1000
    b=1000
    得出这样的结果,我想就不必要多做解释了吧。所以要善于调试。
      

  9.   

    顺序:
    1 m2->b=2000 m2休眠.main()函数走完;
    2 m1->b=1000 执行m2的输出;m1休眠.m2走完
    3 执行m1的方法