java Thread yield()方法为什么失效???

来源:百度知道 编辑:UC知道 时间:2024/06/10 11:41:35
public class TestYield {
public static void main(String []args) {
YieldTest y1=new YieldTest("y1");
YieldTest y2=new YieldTest("y2");
y1.start();
y2.start();
}
}

class YieldTest extends Thread {
YieldTest(String s) {
super(s);
}
public void run() {
for(int i=1;i<=30;i++) {
System.out.println(getName()+":"+i);
if(i%10==0){
yield();
}
}
}
}

//令人发指的程序结果!!!
以上代码运行的结果为:
y1:1
y1:2
y1:3
y1:4
y1:5
y1:6
y1:7
y1:8
y1:9
y1:10
y2:1
y2:2
y1:11
y1:12
y1:13
y1:14
y1:15
y1:16
y1:17
y1:18
y1:19
y1:20
y1:21
y1:22
y1:23
y1:24
y1:25
y1:26
y1:27
y1:28
y1:29
y1:30
y2:3
y2:4
y2:5
y2:6
y2:7
y2:8
y2:9

我是来学习的,我觉得楼上说的基本是对的。
你的程序我拿去跑了几次,结果都和预期的一样,10个10个的输出。
刚才查了一下资料,上面说了yield()出来的执行顺序很多是不确定的,特别是在程序本身有地方需要占用大量系统时间的情况下。
要准确控制线程执行的顺序,最好不要使用yield();可以用sleep()来控制,也可以用wait()+notify()来控制,但是也不会非常精确

首先线程的执行时间是由操作系统分配的
第一次分配时间片1给线程y1,比如说10ms,而y1执行到yield的时候用了9ms,打印了下面的东西:
y1:1
y1:2
y1:3
y1:4
y1:5
y1:6
y1:7
y1:8
y1:9
y1:10

执行yield,让给y2执行。此时系统可能随机分配2ms的时间给y2,y2打印两句后,也就是:
y2:1
y2:2
y2时间片用完了,让出cpu,系统可能又随机分配10ms时间给y1,此时y1打印了下面的:
y1:11
y1:12
y1:13
y1:14
y1:15
y1:16
y1:17
y1:18
y1:19
y1:20
然后y1要么时间足够执行到了yield或是时间片恰好用完,此时系统分配时间片给其他的程序,如你的qq,浏览器等,但就是没有分配时间给y2,此时再次给y1分配了可能10ms时间,y1用了9ms打印了下面的:
y1:21
y1:22
y1:23
y1:24
y1:25
y1:26
y1:27
y1:28
y1:29
y1:30
此时y1执行yield了且结束了线程,把cpu让给其他程序,此时y2获得了10ms的时间,用了9ms打印下面的:
y2:3
y2:4
y2:5
y2:6
y2:7
y2:8
y2:9
y2:10
此时