java高手请帮个忙

来源:百度知道 编辑:UC知道 时间:2024/06/17 16:22:07
public class TT1 implements Runnable
{
int b = 100;

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

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

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

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

tt.m2();
System.out.println(tt.b);
}
}
这个程序的结果为什么是2000 2000 b=1000
谁能不能帮我解释一下
不是先执行m1的吗

充分的理解下多线程
m1被run调用以后,就会sleep
m2继续被执行,m2的sleep时间短,就会出现2000
这个时候继续执行System.out.println(tt.b);,出现的也就是2000了
m1这个时候sleep时间到,继续执行,所以就会出现 b=1000

要注意,多线程里面,主线程启动子线程以后,不会等待子线程执行完毕再往下调用,除非你用了其他的限制,否则不会停止

因为 m2这个方法..你用的是start() 不是 run() 所以结果是2000

是要先执行m1.
b被赋值为1000;
但是m1因为下面的语句
Thread.sleep(5000);
会主动休眠5秒此时

于是先执行tt.m2
因为
Thread.sleep(2500);
先休眠2.5秒

此时m1中的5秒休眠尚未结束.
因此继续执行
b=2000,b被赋值为2000
然后执行
然后继续执行
System.err.println(" " + b);
打印出
2000

因为m1的5秒休眠尚未结束
于是继续执行
System.err.println(tt.b);
打印出
2000

然后等m1的5秒休眠结束后.执行
System.err.println("b = " + b);
打印
b=2000

于是运行结果为
2000
2000
b=2000