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()的文档,thread-1应该产生并允许thread-2在第3次循环之后进行处理。但是,输出并不像预期的那样。相同的线程继续跳过第3次迭代。在一个线程完成循环后,其他线程以相同的行为执行。请解释一下。
输出:
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]
答案 0 :(得分:5)
java.lang.Thread.yield()方法导致当前正在执行的线程对象暂时暂停并允许其他线程执行。
注意:其他线程可以再次使用同一个线程。无法保证JVM选择哪个线程。
答案 1 :(得分:1)
与多线程的几乎所有方面一样,即使您的情况也不能保证按预期运行。 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()
完全可以忽略(在您的情况下可能会发生这种情况。如果您反复获得相同的结果)
答案 2 :(得分:0)
阅读This文章。 yield方法是请求线程休眠。它可能发生与否。