Java多线程——线程的优先级和生命周期
Java多線程——線程的優(yōu)先級(jí)和生命周期
摘要:本文主要介紹了線程的優(yōu)先級(jí)以及線程有哪些生命周期。
部分內(nèi)容來(lái)自以下博客:
https://www.cnblogs.com/sunddenly/p/4106562.html
線程的優(yōu)先級(jí)
線程的優(yōu)先級(jí)及設(shè)置
線程的優(yōu)先級(jí)是為了在多線程環(huán)境中便于系統(tǒng)對(duì)線程的調(diào)度,優(yōu)先級(jí)越高先執(zhí)行機(jī)會(huì)越大,并不是一定先執(zhí)行。
線程的優(yōu)先級(jí)可以理解為線程搶占CPU時(shí)間片的概率,并不能保證優(yōu)先級(jí)高的線程一定會(huì)先執(zhí)行。
不同的系統(tǒng)有不同的線程優(yōu)先級(jí)的取值范圍,同一個(gè)優(yōu)先級(jí)在不同的系統(tǒng)里的值可能是不同的。
一個(gè)線程的優(yōu)先級(jí)設(shè)置遵從以下原則:
線程創(chuàng)建時(shí),子繼承父的優(yōu)先級(jí)。
線程創(chuàng)建后,可通過調(diào)用setPriority()方法改變優(yōu)先級(jí)。
線程的優(yōu)先級(jí)是1-10之間的正整數(shù),線程優(yōu)先級(jí)最高為10,最低為1,默認(rèn)為5。
1- MIN_PRIORITY
10-MAX_PRIORITY
5-NORM_PRIORITY
線程的調(diào)度策略
線程調(diào)度器選擇優(yōu)先級(jí)最高的線程運(yùn)行。但是,如果發(fā)生以下情況,就會(huì)終止線程的運(yùn)行:
線程體中調(diào)用了yield()方法,讓出了對(duì)CPU的占用權(quán)。
線程體中調(diào)用了sleep()方法,使線程進(jìn)入睡眠狀態(tài)。
線程由于I/O操作而受阻塞。
另一個(gè)更高優(yōu)先級(jí)的線程出現(xiàn)。
在支持時(shí)間片的系統(tǒng)中,該線程的時(shí)間片用完。
線程的生命周期
線程的生命周期:一個(gè)線程從創(chuàng)建到消亡的過程。
如下圖,表示線程生命周期中的各個(gè)狀態(tài):
新建狀態(tài)(New)
當(dāng)線程對(duì)象對(duì)創(chuàng)建后,即進(jìn)入了新建狀態(tài)。
就緒狀態(tài)(Ready)
當(dāng)調(diào)用線程對(duì)象的start()方法,線程即進(jìn)入就緒狀態(tài)。處于就緒狀態(tài)的線程,只是說(shuō)明此線程已經(jīng)做好了準(zhǔn)備,隨時(shí)等待CPU調(diào)度執(zhí)行,并不是說(shuō)執(zhí)行了start()此線程立即就會(huì)執(zhí)行。
當(dāng)調(diào)用線程的yield()方法時(shí),線程從運(yùn)行狀態(tài)轉(zhuǎn)換為就緒狀態(tài),但接下來(lái)CPU調(diào)度就緒狀態(tài)中的哪個(gè)線程具有一定的隨機(jī)性。
運(yùn)行狀態(tài)(Running)
當(dāng)CPU開始調(diào)度處于就緒狀態(tài)的線程時(shí),此時(shí)線程才得以真正執(zhí)行,即進(jìn)入到運(yùn)行狀態(tài)。
注:就緒狀態(tài)是進(jìn)入到運(yùn)行狀態(tài)的唯一入口,也就是說(shuō),線程要想進(jìn)入運(yùn)行狀態(tài)執(zhí)行,首先必須處于就緒狀態(tài)中。
阻塞狀態(tài)(Blocked)
處于運(yùn)行狀態(tài)中的線程由于某種原因,暫時(shí)放棄對(duì)CPU的使用權(quán),停止執(zhí)行,此時(shí)進(jìn)入阻塞狀態(tài),直到其進(jìn)入到就緒狀態(tài),才有機(jī)會(huì)再次被CPU調(diào)用以進(jìn)入到運(yùn)行狀態(tài)。根據(jù)阻塞產(chǎn)生的原因不同,阻塞狀態(tài)又可以分為三種。
等待阻塞:運(yùn)行狀態(tài)中的線程執(zhí)行wait()方法,使本線程進(jìn)入到等待阻塞狀態(tài)。
同步阻塞:線程在獲取synchronized同步鎖失敗(因?yàn)殒i被其它線程所占用),它會(huì)進(jìn)入同步阻塞狀態(tài)。
其他阻塞:通過調(diào)用線程的sleep()或join()或發(fā)出了I/O請(qǐng)求時(shí),線程會(huì)進(jìn)入到阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時(shí)、join()等待線程終止或者超時(shí)、I/O處理完畢時(shí),線程重新轉(zhuǎn)入就緒狀態(tài)。
死亡狀態(tài)(Dead)
線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。
線程的上下文切換
對(duì)于單核CPU來(lái)說(shuō),CPU在一個(gè)時(shí)刻只能運(yùn)行一個(gè)線程,當(dāng)在運(yùn)行一個(gè)線程的過程中轉(zhuǎn)去運(yùn)行另外一個(gè)線程,這個(gè)叫做線程上下文切換。
由于當(dāng)前線程的任務(wù)在切換的時(shí)候可能沒有執(zhí)行完畢,所以在切換時(shí)需要保存線程的運(yùn)行狀態(tài),以便下次切換回來(lái)的時(shí)候能夠回到切換時(shí)的運(yùn)行狀態(tài),繼續(xù)進(jìn)行操作。一般來(lái)說(shuō),線程上下文切換過程中會(huì)記錄指令寄存器、程序計(jì)數(shù)器、累加寄存器等其他數(shù)據(jù)。指令寄存器保留了線程在切換時(shí)執(zhí)行到了哪條指令,以便繼續(xù)運(yùn)行。程序計(jì)數(shù)器存儲(chǔ)了下一條指令在主存儲(chǔ)器中的地址。累加寄存保存了程序的運(yùn)算結(jié)果,以及變量的值。
雖然多線程可以使得任務(wù)執(zhí)行的效率得到提升,但是由于在線程切換時(shí)同樣會(huì)帶來(lái)一定的開銷代價(jià),并且多個(gè)線程會(huì)導(dǎo)致系統(tǒng)資源占用的增加,所以在進(jìn)行多線程編程時(shí)要注意這些因素。
轉(zhuǎn)載于:https://www.cnblogs.com/shamao/p/10860174.html
總結(jié)
以上是生活随笔為你收集整理的Java多线程——线程的优先级和生命周期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React Router 黑笔记?
- 下一篇: 微信小程序对接阿里云视频点播,备忘