Java線(xiàn)程讓步_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
yield()介紹
yield()的作用是讓步。它能讓當(dāng)前線(xiàn)程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級(jí)的等待線(xiàn)程獲取執(zhí)行權(quán);但是,并不能保證在當(dāng)前線(xiàn)程調(diào)用yield()之后,其它具有相同優(yōu)先級(jí)的線(xiàn)程就一定能獲得執(zhí)行權(quán);也有可能是當(dāng)前線(xiàn)程又進(jìn)入到“運(yùn)行狀態(tài)”繼續(xù)運(yùn)行!
yield()示例
下面,通過(guò)示例查看它的用法。
// YieldTest.java的源碼 class ThreadA extends Thread{ public ThreadA(String name){ super(name); } public synchronized void run(){ for(int i=0; i <10; i++){ System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i); // i整除4時(shí),調(diào)用yield if (i%4 == 0) Thread.yield(); } } } public class YieldTest{ public static void main(String[] args){ ThreadA t1 = new ThreadA("t1"); ThreadA t2 = new ThreadA("t2"); t1.start(); t2.start(); } }
(某一次的)運(yùn)行結(jié)果:
t1 [5]:0
t2 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9
結(jié)果說(shuō)明:
“線(xiàn)程t1”在能被4整數(shù)的時(shí)候,并沒(méi)有切換到“線(xiàn)程t2”。這表明,yield()雖然可以讓線(xiàn)程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”;但是,它不一定會(huì)讓其它線(xiàn)程獲取CPU執(zhí)行權(quán)(即,其它線(xiàn)程進(jìn)入到“運(yùn)行狀態(tài)”),即使這個(gè)“其它線(xiàn)程”與當(dāng)前調(diào)用yield()的線(xiàn)程具有相同的優(yōu)先級(jí)。
yield() 與 wait()的比較
我們知道,wait()的作用是讓當(dāng)前線(xiàn)程由“運(yùn)行狀態(tài)”進(jìn)入“等待(阻塞)狀態(tài)”的同時(shí),也會(huì)釋放同步鎖。而yield()的作用是讓步,它也會(huì)讓當(dāng)前線(xiàn)程離開(kāi)“運(yùn)行狀態(tài)”。它們的區(qū)別是:
(01) wait()是讓線(xiàn)程由“運(yùn)行狀態(tài)”進(jìn)入到“等待(阻塞)狀態(tài)”,而不yield()是讓線(xiàn)程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”。
(02) wait()是會(huì)線(xiàn)程釋放它所持有對(duì)象的同步鎖,而yield()方法不會(huì)釋放鎖。
下面通過(guò)示例演示yield()是不會(huì)釋放鎖的。
// YieldLockTest.java 的源碼 public class YieldLockTest{ private static Object obj = new Object(); public static void main(String[] args){ ThreadA t1 = new ThreadA("t1"); ThreadA t2 = new ThreadA("t2"); t1.start(); t2.start(); } static class ThreadA extends Thread{ public ThreadA(String name){ super(name); } public void run(){ // 獲取obj對(duì)象的同步鎖 synchronized (obj) { for(int i=0; i <10; i++){ System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i); // i整除時(shí),調(diào)用yield if (i%4 == 0) Thread.yield(); } } } } }
(某一次)運(yùn)行結(jié)果:
t1 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:0
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9
結(jié)果說(shuō)明:
主線(xiàn)程main中啟動(dòng)了兩個(gè)線(xiàn)程t1和t2。t1和t2在run()會(huì)引用同一個(gè)對(duì)象的同步鎖,即synchronized(obj)。在t1運(yùn)行過(guò)程中,雖然它會(huì)調(diào)用Thread.yield();但是,t2是不會(huì)獲取cpu執(zhí)行權(quán)的。因?yàn)椋瑃1并沒(méi)有釋放“obj所持有的同步鎖”
以上所述是小編給大家介紹的Java線(xiàn)程讓步_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 詳解Java中的線(xiàn)程讓步y(tǒng)ield()與線(xiàn)程休眠sleep()方法
- java基本教程之線(xiàn)程讓步 java多線(xiàn)程教程
- Java多線(xiàn)程yield心得分享
- Java后臺(tái)線(xiàn)程操作示例【守護(hù)線(xiàn)程】
- Java中join線(xiàn)程操作實(shí)例分析
- Java多線(xiàn)程的用法詳解
- Java線(xiàn)程關(guān)閉的3種方法
- Java多線(xiàn)程實(shí)現(xiàn)異步調(diào)用的方法
- java基本教程之java線(xiàn)程等待與java喚醒線(xiàn)程 java多線(xiàn)程教程
- java線(xiàn)程之使用Runnable接口創(chuàng)建線(xiàn)程的方法
- Java線(xiàn)程中sleep和wait的區(qū)別詳細(xì)介紹
- Java線(xiàn)程讓步y(tǒng)ield用法實(shí)例分析
相關(guān)文章
Spring注解 TX聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Spring注解 - TX 聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號(hào)
利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號(hào)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系
這篇文章主要介紹了Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系的相關(guān)資料,需要的朋友可以參考下2016-11-11MyBatis中執(zhí)行相關(guān)SQL語(yǔ)句的方法
本文主要介紹了MyBatis中執(zhí)行相關(guān)SQL語(yǔ)句的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08mybatis中foreach報(bào)錯(cuò):_frch_item_0 not found的解決方法
這篇文章主要給大家介紹了mybatis中foreach報(bào)錯(cuò):_frch_item_0 not found的解決方法,文章通過(guò)示例代碼介紹了詳細(xì)的解決方法,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06淺談Java中BigDecimal類(lèi)的簡(jiǎn)單應(yīng)用
這篇文章主要介紹了淺談Java中BigDecimal類(lèi)的簡(jiǎn)單應(yīng)用,BigDecimal是由任意精度的整數(shù)非標(biāo)度值和32位的整數(shù)標(biāo)度組成,如果為零或正數(shù),則標(biāo)度是小數(shù)點(diǎn)后的位數(shù),如果為負(fù)數(shù),則將該數(shù)的非標(biāo)度值乘以?10的負(fù)scale次冪,需要的朋友可以參考下2023-07-07親測(cè)SpringBoot參數(shù)傳遞及@RequestBody注解---踩過(guò)的坑及解決
這篇文章主要介紹了親測(cè)SpringBoot參數(shù)傳遞及@RequestBody注解---踩過(guò)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10