Java多线程问题

peter20091001 2016-08-24 11:43:40

public class ThreadA {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadB b = new ThreadB();
b.start();
synchronized(b){
try {
System.out.println("this is a thread");
b.wait();
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("b.total="+b.total);
}

}
}
class ThreadB extends Thread {
int total;
public void run() {
synchronized (this) {
for(int i = 0;i < 10;i ++) {
total +=i;
System.out.println(i);
}
notify();
}
}
}

这段代码运行结果是
this is a thread
1
2
3
4
5
6
7
8
9
b.total=45
红色的这段代码和ThreadB.run()方法中的代码都加了synchronized,为什么先执行红色的这段,后执行ThreadB?
...全文
275 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
肃穆丶 2016-08-24
  • 打赏
  • 举报
回复
红色代码这你不是使用了wait()嘛,,所以就去执行Thread B 了啊,然后notify() 唤醒嘛,,在输出结果。
skgary 2016-08-24
  • 打赏
  • 举报
回复
因为创建线程一般比较慢,所以先执行到红色部分。
ddddouche 2016-08-24
  • 打赏
  • 举报
回复
线程调度产生的结果,一般来说main所控制的主线程执行较快,因为你的main方法就是主线程里面的。所以根本不用耗费cpu时间去创建线程。LZ的ThreadB子线程需要花费cpu时间去进行创建,所以相对比较慢,也是出现LZ得到结果的原因。
zhuangqingch 2016-08-24
  • 打赏
  • 举报
回复
程序的运行结果有2种可能,一种是main方法中的synchronized代码块比ThreadB.run先执行,结果如楼主看到的。另一种结果则相反,结果也是楼主疑惑并希望看到的结果。 程序中后一种情况比较难看到。由于线程调用start()后到真正被调度执行run()方法,需要消耗一定时间,在此时间内,main线程有很大机会执行到synchronized代码块那。如果要看到另一种情况,可以在调用b.start()后,Sleep一段时间,或者做一些运算操作,保证ThreadB.run被先调度

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧