一个简单的线程经典问题,请解释一下执行过程

来源:百度知道 编辑:UC知道 时间:2024/06/04 06:00:14
【代码源文件】TT.java
===========================================================
public class TT implements Runnable {
int b = 100;

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

public synchronized void m2() throws Exception {
Thread.sleep(4000);
b = 2000;
System.out.println("m2 " + b);
}

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();
}
}

========================================================
【结果:】
先等4秒钟输出m2 2000
再等2秒钟输出b=1000
========================================================

【我的疑问:】
【1】:为什么不能是m1先执行,将b改成

第二个问题,你将m1和m2前面的synchronized 去掉就可以了。

对于第一个问题,首先要将m1和m2前面的synchronized 去掉,然后必须要修改m1和m2的sleep时间才能达到你的效果。而且m2的sleep时间应该比m1少。
因为,m2的sleep时间长的话,从程序中看:m2方法一进去就sleep了,主程序会转到m1,将b赋值成1000,然后m1 sleep。而直到m1 sleep结束,m2仍然还没有结束sleep,主程序就会将m1运行完,这样就会输出b=1000,最后才是等m2被唤醒,给b赋值2000,并且输出m2 2000。

http://www.blogjava.net/swingboat/archive/2007/05/08/115882.html
看看这个网站可能会帮上你.