A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© luqh 中级黑马   /  2015-3-19 17:22  /  1029 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. <TABLE style="WIDTH: 50%" class=t_table cellSpacing=0 cellPadding=0>
  2. <TBODY>
  3. <TR>
  4. <TD> </TD>
  5. <TD> </TD></TR>
  6. <TR>
  7. <TD> </TD>
  8. <TD> </TD></TR></TBODY></TABLE>package Thread;

  9. public class ThreadDemo {
  10. public static void main(String[] args) {
  11. Person1 p1 = new Person1();
  12. Person2 p2 = new Person2();
  13. p1.start();
  14. p2.start();
  15. System.out.println("over");
  16. }
  17. }
  18. class Person1 extends Thread{
  19. public void run(){
  20. for(int i=0;i<2;i++){
  21. System.out.println(i+"person1在运行");
  22. Thread.yield();
  23. }
  24. }
  25. }
  26. class Person2 extends Thread{
  27. public void run(){
  28. for(int i=0;i<3;i++){
  29. System.out.println(i+"person2在运行");
  30. Thread.yield();
  31. }
  32. }
  33. }
复制代码
上面这段线程的代码为什么执行的结果为什么是这样呢?
over
0person2在运行
0person1在运行
1person2在运行
1person1在运行
2person2在运行

1.我认为应该先输出   person1再输出over呢?
2.我先调用的p1.start()为什么是person2在person1前面呢?

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1

查看全部评分

3 个回复

倒序浏览
还有Thread.yield();使线程从running状态到runable  那么怎么触发从runable到running状态呢?

回复 使用道具 举报
对于问题1、问题2,其实这个先输出person1还是over,这个情况是不确定的,根据你输出的情况来看,应该是person1获得执行权后,还没来得及执行,就被person2抢去了,person2也还没执行,就被主线程抢去了,主线程执行完后,person2抢到了执行,然后就输出了你那样的结果;

至于Thread.yield(),只是让线程回到可运行状态,也就是准备状态,因此不需要触发,也有可能person1刚一yield,person2还没开始执行,就又被person1抢去了,如果你循环次数足够多的话,就会出现这样的结果,如果用wait()和notify()的话,可能效果会好点

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
谢谢你的回答,wait()和notify()还没看到这块。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马