这是运行的结果,很困惑!!!! 为什么最后一条语句输出是1000?? 我的分析应该是2000。
请各位指教谢谢 !!!!!!
tt b = 1000
tt1 b = 1000
main 1000
main 1000/**
*
*
*/
public class SychronizeTest implements Runnable {
int b = 100; public synchronized void m1() throws InterruptedException { b = 1000;
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + " b = " + b); } public void run() {
try {
m1();
} catch (InterruptedException e) { e.printStackTrace();
} } public synchronized void m2() { try {
b = 2000;
// System.out.println(b);//这里输出 2000 为什么最后一条语句输出是1000??
Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace();
}
} /**
* 功能:
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException { SychronizeTest t = new SychronizeTest();
SychronizeTest t1 = new SychronizeTest();
Thread tt = new Thread(t, "tt");
Thread tt1 = new Thread(t1, "tt1"); tt.start();
tt1.start(); t1.m2(); Thread.sleep(6500);
System.out.println(Thread.currentThread().getName() + " " + t.b); System.out.println(Thread.currentThread().getName() + " " + t1.b);
}}
请各位指教谢谢 !!!!!!
tt b = 1000
tt1 b = 1000
main 1000
main 1000/**
*
*
*/
public class SychronizeTest implements Runnable {
int b = 100; public synchronized void m1() throws InterruptedException { b = 1000;
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + " b = " + b); } public void run() {
try {
m1();
} catch (InterruptedException e) { e.printStackTrace();
} } public synchronized void m2() { try {
b = 2000;
// System.out.println(b);//这里输出 2000 为什么最后一条语句输出是1000??
Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace();
}
} /**
* 功能:
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException { SychronizeTest t = new SychronizeTest();
SychronizeTest t1 = new SychronizeTest();
Thread tt = new Thread(t, "tt");
Thread tt1 = new Thread(t1, "tt1"); tt.start();
tt1.start(); t1.m2(); Thread.sleep(6500);
System.out.println(Thread.currentThread().getName() + " " + t.b); System.out.println(Thread.currentThread().getName() + " " + t1.b);
}}
tt线程不影响结果,这里就不说了
关键就在于:
tt1.start()并不会使得tt1线程马上运行而先运行t1.m1()
程序从main线程开始,语句顺序:
1...tt1.start() [main]
但是,tt1.start()只是让tt1线程处于"就绪"状态,并没有获得CPU而不会运行,CPU还是main在"占着"2....t1.m2() [main]
这时t1.b=20003....Thread.sleep(6500); [main]
这时main线程退出CPU,tt1线程获得cpu而执行tt1.run从而4.....执行t1.m1() [tt1]
这时t1.b=1000;5.....tt1.sleep() [tt1]
main获得CPU6.....System.out.println(Thread.currentThread().getName() + " " + t1.b);
t1.b=1000
-----------------------
说的复杂点的话,我觉得有可能答案是不确定的,因为main线程有可能在执行中被打断如果说main线程执行
tt1.start();
t1.m2();
三行时中途不被打断
那么方法就是上面的顺序---------
如果说mian线程执行到tt1.start();被打断
那么tt1线程将会在main执行t1.m2()之前获得CPU而先执行t1.m1():
1....tt1.start(); [main]2....main线程被打断打断,tt1获得cpu3....t1.m1() [tt1]
这时t1.b=10004....再转回main执行 t1.m2() [main]
这时t1.b=20005.....System.out.println(Thread.currentThread().getName() + " " + t1.b); [main]
t1.b=2000
------------------
另外:java有没有规定main线程不会被打断???
要点是:
一个CPU同一个时间只有一个线程运行
线程的三种(四?)状态和互相转化
我再加点其实t1.m2()并不是比tt.start();tt1.start();后执行你可以尝试我修改的你的代码public class SychronizeTest implements Runnable {
int b = 100; public synchronized void m1() throws InterruptedException { b = 1000;
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + " b = " + b); } public void run() {
try {
System.out.println(Thread.currentThread().getName() + "-start !" );
m1();
System.out.println(Thread.currentThread().getName() + "-stop !" );
} catch (InterruptedException e) { e.printStackTrace();
} } public synchronized void m2() { try {
b = 2000;
System.out.print("here is method m2(), b=");
System.out.println(b);[/color[color=#99CC00]]//这里输出 2000 为什么最后一条语句输出是1000??
Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace();
}
} /**
* 功能:
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException { SychronizeTest t = new SychronizeTest();
SychronizeTest t1 = new SychronizeTest();
Thread tt = new Thread(t, "tt");
Thread tt1 = new Thread(t1, "tt1"); tt.start();
tt1.start(); t1.m2(); Thread.sleep(6500);
System.out.println(Thread.currentThread().getName() + " " + t.b); System.out.println(Thread.currentThread().getName() + " " + t1.b);
} } 红色的内容是我修改的在我机子上运行的结果如下:tt-start!
here is method m2(),b=tt1-start!
2000
tt b=1000
tt-stop!
tt1 b=1000
tt1-stop!
main 1000
main 1000其中,可以看出m2()方法被tt1.start()打断了!(蓝色内容)
蓝色的内容是tt-start!
好像不是很看的清