[英]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.