日期:2014-05-20  浏览次数:20584 次

【考考你】这段JAVA小程序,输出结果是多少?
public class TT implements Runnable{
int b = 100;

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

public void m2() throws Exception{
b = 2000;
Thread.sleep(500);
System.out.println(b);
}

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

}

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

执行结果是多少?
为什么是这个结果,我百思不得其解!

------解决方案--------------------
你启动一个线程的时候,这个新的线程并不一定马上运行.
程序里有两个线程,本身的main方法的线程main,然后里边还有一个线程t

首先是执行main线程,虽然对t进行了start调用,它当前的时间还没有用完,接着马上进入tt对象的方法m2,此时main线程锁住了对象tt,线程t再启动的时候,它无法进入m1()方法.只能是等m2方法执行完,才能执行m1方法

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

//在此处加一定延迟的话,就会是t线程先执行了
tt.m2();
}
}
------解决方案--------------------
唉,没看清题目,另一个和这个很相似的帖子上是有synchronized关键字的

main线程中先进入的m2方法里改变值2000,然后main线程休眠,此时线程t运行,进入方法m1,改变值后1000,就休眠了,此过程中,main方法继续执行,此时b值被改了,所以变成了1000;
------解决方案--------------------
执行顺序:
1.主线程m2()执行,b=2000,休眠200ms
2.线程t执行,b=1000,休眠5s
3.主线程m2()继续执行,打印b,b为1000
4.线程t2继续执行打印b=1000

结果:1000
b=1000

第二题类似
------解决方案--------------------
探讨
执行顺序:
1.主线程m2()执行,b=2000,休眠200ms
2.线程t执行,b=1000,休眠5s
3.主线程m2()继续执行,打印b,b为1000
4.线程t2继续执行打印b=1000

结果:1000
b=1000

第二题类似

------解决方案--------------------
以你的第一个例子为例,首先你要了解线程是什么,MAIN执行后,当到线程的时候,去执行线程,同时继续向下执行,若遇到的不是线程,而是调用方法,那就是等方法执行完后再向下执行,由于m1()的睡眠时间长,m2()方法先执行完,故先输出,再等mi()执行完输出