多線(xiàn)程(1) — 多線(xiàn)程狀態(tài)及轉(zhuǎn)化

多線(xiàn)程分為5種狀態(tài):

  1. 新建(New):新建線(xiàn)程在jvm虛擬機(jī)棧里,線(xiàn)程棧是私有的。而jvm中的本地方法棧是用于本地native方法的私有棧。

  2. 就緒(Runnable):也叫“可執(zhí)行狀態(tài)”調(diào)用start進(jìn)入可執(zhí)行狀態(tài)后并不是馬上運(yùn)行,而是處于可運(yùn)行線(xiàn)程池中隨時(shí)待命等待CPU的調(diào)度。

  3. 運(yùn)行(Running):當(dāng)獲取到CPU執(zhí)行權(quán)邊開(kāi)始從就緒狀態(tài)變成運(yùn)行狀態(tài),開(kāi)始執(zhí)行run()里面的方法。

  4. 阻塞(Blocked):當(dāng)失去 cpu 使用權(quán)的時(shí)候,便進(jìn)入到阻塞狀態(tài),等待再次搶占資源進(jìn)入就緒(runnable)狀態(tài)才有機(jī)會(huì)獲得運(yùn)行。阻塞分三種情況:
    1).等待阻塞:執(zhí)行wait()方法,JVM將線(xiàn)程放入等待隊(duì)列(waitting queue)中。
    2).同步阻塞:運(yùn)行的線(xiàn)程在獲取對(duì)象同步鎖時(shí),若該同步鎖被別的線(xiàn)程占用,則JVM會(huì)把該線(xiàn)程放入鎖池(lock pool)中。
    3).其他阻塞:執(zhí)行sleep()或join()方法,或者I/O請(qǐng)求時(shí),JVM會(huì)把線(xiàn)程置為阻塞狀態(tài)。

  5. 死亡(Dead):在線(xiàn)程執(zhí)行完run()、main()方法后線(xiàn)程結(jié)束,或者因?yàn)槟撤N異?;蛘咤e(cuò)誤而終止運(yùn)行。

以下是從網(wǎng)上找到的一張狀態(tài)轉(zhuǎn)化圖:


image.png

以上圖比較詳細(xì),只說(shuō)幾個(gè)需要注意的點(diǎn):
1.sleep()與wait()的區(qū)別:都使線(xiàn)程從running變成blocked狀態(tài),但是sleep是Thread類(lèi)的方法,wait是Object的方法,所以sleep不能改變對(duì)象鎖也就不能釋放鎖資源,仍然占有鎖資源,而wait會(huì)釋放當(dāng)前對(duì)象的鎖資源。
2.阻塞恢復(fù)的線(xiàn)程不一定會(huì)馬上去執(zhí)行,因?yàn)镃PU可能還在執(zhí)行其他的任務(wù),只是擁有CPU執(zhí)行權(quán)繼續(xù)競(jìng)爭(zhēng)。
3.join():等待別的線(xiàn)程執(zhí)行完了自己再執(zhí)行。
4.yield():是將running中的線(xiàn)程“退讓”成runnable的狀態(tài),也就是讓執(zhí)行中的線(xiàn)程編程可執(zhí)行的狀態(tài)重新進(jìn)行競(jìng)爭(zhēng)(不一定能競(jìng)爭(zhēng)上)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容