[英]yield() method not working as expected
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在第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]
java.lang.Thread.yield()方法使当前正在执行的线程对象暂时暂停并允许其他线程执行。
注意 :该其他线程可以再次成为同一线程。 不能保证JVM选择哪个线程。
与Multithreading的几乎所有方面一样,即使您的情况也不能保证表现出预期的效果。 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()
可以完全忽略(在您的情况下可能会发生。如果您一次又一次地得到相同的结果)
阅读该文章。 yield方法是请求线程休眠。 它可能发生与否。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.