摘要:,看到很多文章把理解為暫停,其實是不準確的,翻譯過來用讓步更為準確一些。如下在中我們可以看到官方的解釋,更多的是作為調(diào)試或測試時候使用也就是瘋狂重分配,提高切換概率,模擬并發(fā)
yield,看到很多文章把yield理解為暫停,其實是不準確的,翻譯過來用讓步更為準確一些。簡單描述下其作用:
使調(diào)用yield的正在執(zhí)行的線程讓出cpu,讓同等優(yōu)先權(quán)的其他線程包括自身重新進行分配調(diào)度
概念性的東西或許有些難理解,打個比方,有一個題庫,里面有很多數(shù)學(xué)題目,學(xué)生來抽取題庫中的題來解答,其中題庫相當(dāng)所有線程,題目相當(dāng)于單個線程,學(xué)生相當(dāng)于cpu。那么某一次抽取到題目A,開始解答,解到一半,吧唧,調(diào)用了個yield,好的,這個時候?qū)W生會把未做完的題目A放回題庫,然后重新選取一個題目進行解答,那么下一次選取到哪個題目,仍然是學(xué)生自己決定,可能選到題目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更多的是作為調(diào)試或測試時候使用(也就是瘋狂重分配,提高切換概率,模擬并發(fā))
/** * 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();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68324.html
摘要:線程的基本狀態(tài)線程的基本操作與內(nèi)存模型線程組守護線程線程優(yōu)先級線程安全與隱蔽錯誤線程的基本狀態(tài)線程的生命周期線程的基本操作新建線程終止線程立即終止線程所有活動方法在結(jié)束線程時會直接終止線程并立即釋放這個線程所持有的鎖可能引起數(shù)據(jù)不一致強烈建 1.線程的基本狀態(tài) 2.線程的基本操作 3. volatile與java內(nèi)存模型 4.線程組 5.守護線程(Daemon) ...
摘要:目標線程由運行狀態(tài)轉(zhuǎn)換為就緒狀態(tài),也就是讓出執(zhí)行權(quán)限,讓其他線程得以優(yōu)先執(zhí)行,但其他線程能否優(yōu)先執(zhí)行時未知的。函數(shù)的官方解釋是意思是使調(diào)用該函數(shù)的線程讓出執(zhí)行時間給其他已就緒狀態(tài)的線程。 線程允許在同一個進程中同時存在多個程序控制流,即通過線程可以實現(xiàn)同時處理多個任務(wù)的功能。線程會共享進程范圍內(nèi)的資源,例如內(nèi)存句柄和文件句柄,但每個線程都有各自的程序計數(shù)器、棧以及局部變量。 多線程的實...
摘要:安全性小結(jié)我們上邊介紹了原子性操作內(nèi)存可見性以及指令重排序三個在多線程執(zhí)行過程中會影響到安全性的問題。 指令重排序 如果說內(nèi)存可見性問題已經(jīng)讓你抓狂了,那么下邊的這個指令重排序的事兒估計就要罵娘了~這事兒還得從一段代碼說起: public class Reordering { private static boolean flag; private static in...
摘要:告訴當(dāng)前執(zhí)行的線程為線程池中其他具有相同優(yōu)先級的線程提供機會。不能保證會立即使當(dāng)前正在執(zhí)行的線程處于可運行狀態(tài)。當(dāng)達到超時時間時,主線程和是同樣可能的執(zhí)行者候選。下一篇并發(fā)編程線程安全性深層原因 Thread 使用Java的同學(xué)對Thread應(yīng)該不陌生了,線程的創(chuàng)建和啟動等這里就不講了,這篇主要講幾個容易被忽視的方法以及線程狀態(tài)遷移。 wait/notify/notifyAll 首先我...
閱讀 2784·2021-11-23 09:51
閱讀 3539·2021-10-08 10:17
閱讀 1273·2021-10-08 10:05
閱讀 1327·2021-09-28 09:36
閱讀 1846·2021-09-13 10:30
閱讀 2186·2021-08-17 10:12
閱讀 1682·2019-08-30 15:54
閱讀 2011·2019-08-30 15:53