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);呢求高手解释一下
帮帮了 小弟先在这里谢谢大家了
我都想一晚上了 头都大了
帮帮吧
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);呢求高手解释一下
帮帮了 小弟先在这里谢谢大家了
我都想一晚上了 头都大了
帮帮吧
和
System.out.println(tt.b);
2个线程并行执行
当t执行到b=1000时,system才开始输出
因为m2所在的main线程sleep2.5秒
所以system一定会等到m1执行b=1000后才执行
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);
}
}
在主线程开始的时候。
t.start(); 开启了一个线程。但这时主线程还在继续。调用了tt.m2();而这时Thread.sleep(2500);
就开始另一个线程.
我知道啊
我是说为什么不在m2执行完成之后就开始打印最后一句话输出b的值 如果这样的话就是2000而是执行m1的时候在m1睡眠5秒的时候 开始执行最后一句话 打印 结果是1000
为什么