急!!!!!!java多线程里面的小程序!!!!求输出,求为什么!!!!!!! 程序在下面!!!!!

publicclassTTimplementsRunnable{intb=100;publicsynchronizedvoidm1()throwsException{b=... public class TT 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;
}
public void m3(){
System.out.println(b);
}
public void setb(int i){
b = i;
}
public void run(){
try{
m1();
}catch(Exception e){
e.printStackTrace();
}
}

public static void main (String[] arg) throws Exception{
int i=1;
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
System.out.println(tt.b);
tt.m3();
tt.b = 200;
tt.m2();
System.out.println(tt.b);
tt.m3();
}
}
展开
 我来答
xuyue198692
2011-10-31 · TA获得超过442个赞
知道小有建树答主
回答量:105
采纳率:0%
帮助的人:158万
展开全部
输出是
100
1000
b = 200
2000
2000
主要看main函数
TT tt = new TT();//初始化TT此时b=100;
Thread t = new Thread(tt);
t.start();//启动线程t 此时需要申请内存并创建线程,时间稍久。
System.out.println(tt.b);//打印tt.b此时b仍为100
tt.m3();//运行tt.m3(),此时线程t已经启动并已经运行了m1,b=1000并且由于m1有synchronized,表示同步,就是对于其他也使用synchronized的函数,必须等待m1退出,此时m1正在sleep(5000),m3没有synchronized,直接打印出1000
tt.b = 200;//设置b = 200;
tt.m2();//运行m2(),由于有synchronized,因此等待m1的运行结束。main线程在此等待m2的执行。
//经过5000毫秒,m1睡眠完毕,打印出b=200,开始执行m2()
//经过2500毫秒,m2睡眠完毕,将b设置为2000
System.out.println(tt.b);//打印出2000
tt.m3();//打印出2000

//要注意,tt.start()和tt.m2()是不同的执行方式。
tt.start(),表示在main线程里,开启另一个线程的执行,main线程不会受到另一个线程的阻塞或等待的影响。而tt.m2()则是直接运行函数m3(),那么main线程,必须等待m2执行完才会执行后面的其他语句。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友675665c
2011-10-31 · TA获得超过122个赞
知道答主
回答量:72
采纳率:0%
帮助的人:78.6万
展开全部
public class TT 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;
}

public void m3() {
System.out.println("m3.b="+b);
}

public void setb(int i) {
b = i;
}

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

public static void main(String[] arg) throws Exception {
int i = 1;
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
//Thread.sleep(1);
System.out.println("tt.b1="+tt.b);
tt.m3();
tt.b = 200;
tt.m2();
System.out.println("tt.b2="+tt.b);
tt.m3();
}
}
为了更好的说明白,我对你的程序做了小的改动,不影响结果。
程序从主函数开始执行:

打印第一个结果: 当执行到t.start();的时候:多了一个线程。此时新开的线程和main方法的线程是同时运行的,当main方法占有CPU的时候,第一个结果打印的是tt.b1=100,如果新开的线程先于main方法的System.out.println("tt.b1="+tt.b)占有CPU的时候,第一个结果打印出来的是tt.b1=1000。所以说第一个结果每次运行的会不一样。

打印第二个结果: 打印完第一个结果后,新开的线程在b=1000后sleep(5000),此时b为1000,但是新开的线程并不继续执行System.out.println("b = " + b);,让出cpu给tt.m3();第二个打印结果是m3.b=1000

打印第三个结果: 新开的线程sleep期间,main执行完tt.m3();向下执行tt.b = 200;tt.m2();此时b=200,还不是b=2000,然后main线程该执行m2(),但是m2加了synchronized,新开的线程此时正在使用synchronized修饰的m1方法sleep中,所以m2要等m1让出cpu才能执行,所以等m1 的sleep结束以后b=200,打印结果b = 200。

打印第四个结果: 此时m2得以运行,b=2000,(你可以把m2的sleep注释掉,看看结果会怎样,呵呵。)然后接着执行System.out.println("tt.b2="+tt.b);打印结果tt.b2=2000。

打印最后一个结果: 最后一个m3()的时候b的值仍为2000,所以打印结果是m3.b=2000。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
湛江大城小事
2011-10-30 · TA获得超过417个赞
知道小有建树答主
回答量:592
采纳率:0%
帮助的人:317万
展开全部
这种输出的顺序是不确定的,随机性的,因为某个时刻某条线程都有平等的优先!无法确认该时刻是某条线程在执行!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式