public class TT implements Runnable {
int b = 100;

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

public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}

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

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

tt.m2();
System.out.println(tt.b);
}
}这是马士兵的一个程序
当时他的解释是:
先锁定m2方法 当m2执行完成之后 开始执行m1
当m1 执行到b=1000的时候开始执行“System.out.println(tt.b);” 这句话 从而打印出b
在m1睡眠5秒后打印b=1000;
结果也像他解释的一样 但是我的疑问是 
为什么当m2执行完成之后为什么不开始执行System.out.println(tt.b);这句话 打印出来b=2000呢
然后再执行m1 打印b=1000
为什么在执行完m2之后还要先执行以下m1里面的赋值语句 然后再执行System.out.println(tt.b);呢求高手解释一下
帮帮了  小弟先在这里谢谢大家了
我都想一晚上了 头都大了 
帮帮吧

解决方案 »

  1.   

    t.start(); 

    System.out.println(tt.b); 
    2个线程并行执行
    当t执行到b=1000时,system才开始输出
    因为m2所在的main线程sleep2.5秒
    所以system一定会等到m1执行b=1000后才执行
      

  2.   

    没怎么改,加了一些代码,你试试看,结果却变了.public class TT implements Runnable { 
    int b = 100;  public synchronized void m1() throws Exception{ 
    // Thread.sleep(2000);
    System.out.println("进行二卡");
    b = 1000; 
    Thread.sleep(5000); 
    System.out.println("b = " + b); 
    }  public synchronized void m2() throws Exception { 
    System.out.println("开始卡住1");
    Thread.sleep(2500); 
    b = 2000; 
    System.out.println("结束卡住2");
    }  public void run() { 
    try { 
    System.out.println("线程启动-----");
    m1(); 
    } catch(Exception e) { 
    e.printStackTrace(); 

    }  public static void main(String[] args) throws Exception { 
    TT tt = new TT(); 
    Thread t = new Thread(tt); 
    t.start(); 
    tt.m2(); 
    System.out.println("cc="+tt.b); 

    }
      

  3.   

    我是这样理解的。
    在主线程开始的时候。
    t.start(); 开启了一个线程。但这时主线程还在继续。调用了tt.m2();而这时Thread.sleep(2500); 
    就开始另一个线程.
      

  4.   

     你声明为了synchronized,所以m1执行完了才能轮到m2
      

  5.   


    我知道啊
    我是说为什么不在m2执行完成之后就开始打印最后一句话输出b的值  如果这样的话就是2000而是执行m1的时候在m1睡眠5秒的时候 开始执行最后一句话 打印 结果是1000
    为什么