public class YieldDemo extends Thread{
public static void main(String[] args) {
YieldDemo y1 = new YieldDemo();
YieldDemo y2= new YieldDemo();
y1.start();
y2.start();
}
public void run() {
for(int i=0;i<=5;i++) {
if(i==3) {
Thread.yield();
} else
System.out.println(i+Thread.currentThread().toString());
}
}
}
根据yield()的文档,线程1应该屈服,并允许线程2在第三次循环后处理。然而,输出并不像预期的那样。同一线程继续跳过第三次迭代。在一个线程完成循环后,另一个线程以相同的行为执行。请解释。
输出:0Thread[Thread-1,5,main]
1Thread[Thread-1,5,main]
2Thread[Thread-1,5,main]
4Thread[Thread-1,5,main]
5Thread[Thread-1,5,main]
0Thread[Thread-0,5,main]
1Thread[Thread-0,5,main]
2Thread[Thread-0,5,main]
4Thread[Thread-0,5,main]
5Thread[Thread-0,5,main]
java.lang.Thread.yield()方法导致当前正在执行的线程对象暂时暂停,并允许其他线程执行。
:另一个线程可以再次成为同一线程。不能保证JVM会选择哪个线程
与多线程的几乎所有方面一样,即使您的情况也不能保证按预期的方式运行。Thread.yield()
就像给操作系统的一个建议,告诉- 如果可能的话,那么请在这个之前执行其他线程。根据你的系统架构(内核数量,以及其他方面,如亲和性等),操作系统可能会忽略你的请求。
同样,在JDK6U23之后,JVM可能会将您的代码更改为:
public void run() {
for(int i=0;i<=5;i++) {
// 3 is too darn small. and yield() is not necessary
// so let me just iterate 6 times now to improve performance.
System.out.println(i+Thread.currentThread().toString());
}
yield()
可以完全忽略(这可能发生在您的情况中)。如果你一次又一次得到相同的结果)
阅读本文。方法是请求线程进入睡眠状态。这可能会发生,也可能不会。