Java線程中的Thread.yield()詳細(xì)解析
(1)線程運行狀態(tài)轉(zhuǎn)換
新建狀態(tài)(New):新創(chuàng)建了一個線程對象。
就緒狀態(tài)(可執(zhí)行狀態(tài),Runnable):線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權(quán)。
運行狀態(tài)(運行狀態(tài),Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。
阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運行。直到線程進入就緒狀態(tài),才有機會轉(zhuǎn)到運行狀態(tài)。
阻塞的情況分三種:
(1) 等待阻塞:運行的線程執(zhí)行wait()方法,該線程進入等待池中
(2) 同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則該線程進入鎖池中
(3) 其他阻塞:運行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。
死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。
(2)理解線程的優(yōu)先權(quán)
接下來,理解線程優(yōu)先級是很重要的一步,尤其是了解 yield() 函數(shù)的工作過程:
1、記住當(dāng)線程的優(yōu)先級沒有指定時,所有線程都攜帶普通優(yōu)先級。
2、優(yōu)先級可以用從 1 到 10 的范圍指定。10 表示最高優(yōu)先級,1 表示最低優(yōu)先級,5 是普通優(yōu)先級。
3、記住優(yōu)先級最高的線程在執(zhí)行時被給予優(yōu)先。但是不能保證線程在啟動時就進入運行狀態(tài)。
4、與在線程池中等待運行機會的線程相比,當(dāng)前正在運行的線程可能總是擁有更高的優(yōu)先級。
5、由調(diào)度程序決定哪一個線程被執(zhí)行。
6、t.setPriority() 用來設(shè)定線程的優(yōu)先級。
7、記住在線程 start() 方法被調(diào)用之前,線程的優(yōu)先級應(yīng)該被設(shè)定。
8、你可以使用常量,如 MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY 來設(shè)定優(yōu)先級。
(3)Thread.yield
方法作用: 讓當(dāng)前線程從運行狀態(tài) 轉(zhuǎn)為 就緒狀態(tài),以允許具有相同優(yōu)先級的其他線程獲得運行機會。
(4)代碼示例
public class Yield { public static void main(String[] args) { Thread[] threads = new Thread[2]; for (int i=0;i<2;i++){ int index=i; threads[i] = new Thread(new Runnable() { @Override public void run() { System.out.println("threads"+index+":"+1); Thread.yield(); System.out.println("threads"+index+":"+2); } }); threads[i].start(); } } }
多次運行會如下結(jié)果:
threads0:1
threads1:1
threads0:2
threads1:2
或者
threads0:1
threads0:2
threads1:1
threads1:2
結(jié)論:無法保證yield()達(dá)到讓步目的,因為讓步的線程還有可能被線程調(diào)度程序再次選中。
(5)總結(jié)
1、yield 是一個靜態(tài)的原生(native)方法。
2、yield 告訴當(dāng)前正在執(zhí)行的線程把運行機會交給線程池中擁有相同優(yōu)先級的線程。
3、yield 不能保證使得當(dāng)前正在運行的線程迅速轉(zhuǎn)換到可運行的狀態(tài)。
4、它僅能使一個線程從運行狀態(tài)轉(zhuǎn)到可運行狀態(tài),而不是等待或阻塞狀態(tài)。
5、無法保證yield()達(dá)到讓步目的,因為讓步的線程還有可能被線程調(diào)度程序再次選中。
到此這篇關(guān)于Java線程中的Thread.yield()詳細(xì)解析的文章就介紹到這了,更多相關(guān)Thread.yield()詳細(xì)解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java后端調(diào)用微信支付和支付寶支付的詳細(xì)步驟
這篇文章主要介紹了Java后端如何調(diào)用微信支付和支付寶支付,涵蓋了基本概念、配置步驟、代碼示例以及注意事項,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04Spring Boot高效數(shù)據(jù)聚合之道深入講解
這篇文章主要給大家介紹了關(guān)于Spring Boot高效數(shù)據(jù)聚合之道的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06JAVA簡單工廠模式(從現(xiàn)實生活角度理解代碼原理)
本文主要介紹了JAVA簡單工廠模式(從現(xiàn)實生活角度理解代碼原理)的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系
這篇文章主要介紹了關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系,WeakHashMap從名字可以得知主要和Map有關(guān),不過還有一個Weak,我們就更能自然而然的想到這里面還牽扯到一種弱引用結(jié)構(gòu),因此想要徹底搞懂,我們還需要知道四種引用,需要的朋友可以參考下2023-09-09