黑马程序员技术交流社区
标题:
关于线程的问题,求解!!拜托拜托
[打印本页]
作者:
luqh
时间:
2015-3-19 17:22
标题:
关于线程的问题,求解!!拜托拜托
<TABLE style="WIDTH: 50%" class=t_table cellSpacing=0 cellPadding=0>
<TBODY>
<TR>
<TD> </TD>
<TD> </TD></TR>
<TR>
<TD> </TD>
<TD> </TD></TR></TBODY></TABLE>package Thread;
public class ThreadDemo {
public static void main(String[] args) {
Person1 p1 = new Person1();
Person2 p2 = new Person2();
p1.start();
p2.start();
System.out.println("over");
}
}
class Person1 extends Thread{
public void run(){
for(int i=0;i<2;i++){
System.out.println(i+"person1在运行");
Thread.yield();
}
}
}
class Person2 extends Thread{
public void run(){
for(int i=0;i<3;i++){
System.out.println(i+"person2在运行");
Thread.yield();
}
}
}
复制代码
上面这段线程的代码为什么执行的结果为什么是这样呢?
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