摘要:,看到很多文章把理解為暫停,其實是不準確的,翻譯過來用讓步更為準確一些。如下在中我們可以看到官方的解釋,更多的是作為調試或測試時候使用也就是瘋狂重分配,提高切換概率,模擬并發
yield,看到很多文章把yield理解為暫停,其實是不準確的,翻譯過來用讓步更為準確一些。簡單描述下其作用:
使調用yield的正在執行的線程讓出cpu,讓同等優先權的其他線程包括自身重新進行分配調度
概念性的東西或許有些難理解,打個比方,有一個題庫,里面有很多數學題目,學生來抽取題庫中的題來解答,其中題庫相當所有線程,題目相當于單個線程,學生相當于cpu。那么某一次抽取到題目A,開始解答,解到一半,吧唧,調用了個yield,好的,這個時候學生會把未做完的題目A放回題庫,然后重新選取一個題目進行解答,那么下一次選取到哪個題目,仍然是學生自己決定,可能選到題目B、C、D...但是,也可能仍然選到題目A,這就是yield的作用。
demo如下
public class MyThreadYield implements Runnable{ @Override public void run() { for (int i = 10; i < 20; i++) { System.out.println(Thread.currentThread().getName() + ":priority-" + Thread.currentThread().getPriority() + "-------" + i); if (i == 15) { Thread.yield(); } } } public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new MyThreadYield()); thread.setName("first"); Thread thread1 = new Thread(new MyThreadYield()); thread1.setName("second"); thread.start(); thread1.start(); } }
在java doc中我們可以看到官方的解釋,yield更多的是作為調試或測試時候使用(也就是瘋狂重分配,提高切換概率,模擬并發)
/** * A hint to the scheduler that the current thread is willing to yield * its current use of a processor. The scheduler is free to ignore this * hint. * *Yield is a heuristic attempt to improve relative progression * between threads that would otherwise over-utilise a CPU. Its use * should be combined with detailed profiling and benchmarking to * ensure that it actually has the desired effect. * *
It is rarely appropriate to use this method. It may be useful * for debugging or testing purposes, where it may help to reproduce * bugs due to race conditions. It may also be useful when designing * concurrency control constructs such as the ones in the * {@link java.util.concurrent.locks} package. */ public static native void yield();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68324.html
摘要:線程的基本狀態線程的基本操作與內存模型線程組守護線程線程優先級線程安全與隱蔽錯誤線程的基本狀態線程的生命周期線程的基本操作新建線程終止線程立即終止線程所有活動方法在結束線程時會直接終止線程并立即釋放這個線程所持有的鎖可能引起數據不一致強烈建 1.線程的基本狀態 2.線程的基本操作 3. volatile與java內存模型 4.線程組 5.守護線程(Daemon) ...
摘要:目標線程由運行狀態轉換為就緒狀態,也就是讓出執行權限,讓其他線程得以優先執行,但其他線程能否優先執行時未知的。函數的官方解釋是意思是使調用該函數的線程讓出執行時間給其他已就緒狀態的線程。 線程允許在同一個進程中同時存在多個程序控制流,即通過線程可以實現同時處理多個任務的功能。線程會共享進程范圍內的資源,例如內存句柄和文件句柄,但每個線程都有各自的程序計數器、棧以及局部變量。 多線程的實...
摘要:安全性小結我們上邊介紹了原子性操作內存可見性以及指令重排序三個在多線程執行過程中會影響到安全性的問題。 指令重排序 如果說內存可見性問題已經讓你抓狂了,那么下邊的這個指令重排序的事兒估計就要罵娘了~這事兒還得從一段代碼說起: public class Reordering { private static boolean flag; private static in...
摘要:告訴當前執行的線程為線程池中其他具有相同優先級的線程提供機會。不能保證會立即使當前正在執行的線程處于可運行狀態。當達到超時時間時,主線程和是同樣可能的執行者候選。下一篇并發編程線程安全性深層原因 Thread 使用Java的同學對Thread應該不陌生了,線程的創建和啟動等這里就不講了,這篇主要講幾個容易被忽視的方法以及線程狀態遷移。 wait/notify/notifyAll 首先我...
閱讀 2770·2021-11-23 09:51
閱讀 3529·2021-10-08 10:17
閱讀 1261·2021-10-08 10:05
閱讀 1309·2021-09-28 09:36
閱讀 1833·2021-09-13 10:30
閱讀 2174·2021-08-17 10:12
閱讀 1670·2019-08-30 15:54
閱讀 2004·2019-08-30 15:53