黑马程序员技术交流社区

标题: 关于线程的问题,求解!!拜托拜托 [打印本页]

作者: luqh    时间: 2015-3-19 17:22
标题: 关于线程的问题,求解!!拜托拜托

  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前面呢?


作者: luqh    时间: 2015-3-19 17:35
还有Thread.yield();使线程从running状态到runable  那么怎么触发从runable到running状态呢?


作者: 殷俊    时间: 2015-3-19 18:25
对于问题1、问题2,其实这个先输出person1还是over,这个情况是不确定的,根据你输出的情况来看,应该是person1获得执行权后,还没来得及执行,就被person2抢去了,person2也还没执行,就被主线程抢去了,主线程执行完后,person2抢到了执行,然后就输出了你那样的结果;

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





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2