线程的状态、进程的状态
一、線程的狀態(tài)
新建狀態(tài)、就緒狀態(tài)、阻塞狀態(tài)、死亡狀態(tài)。
1、新建狀態(tài)
新創(chuàng)建一個(gè)線程對(duì)象。
2、就緒狀態(tài)
線程對(duì)象創(chuàng)建后,其他線程調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線程位于“可運(yùn)行的線程池”中,變得可運(yùn)行,只等待獲取CPU的使用權(quán)。即在就緒狀態(tài)的進(jìn)程除了CPU之外,其他的運(yùn)行所需資源都已全部獲得。
2.1、就緒狀態(tài)只是說(shuō)有資格運(yùn)行,調(diào)度程序沒(méi)有挑選到你,你就永遠(yuǎn)是可運(yùn)行狀態(tài)。
2.2、調(diào)用線程的start()方法,此線程進(jìn)入就緒狀態(tài)。
2.3、當(dāng)前線程sleep()方法結(jié)束,其他線程join()結(jié)束,等待用戶輸入完畢,某個(gè)線程拿到對(duì)象鎖,這些線程也將進(jìn)入就緒狀態(tài)。
2.4、當(dāng)前線程時(shí)間片用完了,調(diào)用當(dāng)前線程的yeild()方法,當(dāng)前線程進(jìn)入就緒方法。
2.5、鎖池里的線程拿到對(duì)象鎖后,進(jìn)入就緒狀態(tài)。
3、運(yùn)行狀態(tài)
就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。
3.1、run()方法或main()方法結(jié)束后,線程就進(jìn)入終止?fàn)顟B(tài)。
3.2、當(dāng)線程調(diào)用了自身的sleep()方法或其他線程的join()方法,進(jìn)程讓出CPU,然后就會(huì)進(jìn)入阻塞狀態(tài)(該狀態(tài)即停止當(dāng)前線程,但并不釋放所占有的資源即調(diào)用sleep()方法后,線程不會(huì)釋放它的”鎖標(biāo)志“)。當(dāng)sleep()結(jié)束或join()結(jié)束后,該線程進(jìn)入就緒狀態(tài),繼續(xù)等待OS分配CPU時(shí)間片。典型的,sleep()被用在等待某個(gè)資源就緒的情形:測(cè)試發(fā)現(xiàn)條件不滿足后,讓線程阻塞一段時(shí)間后重新測(cè)試,直到條件滿足為止。
3.3、線程調(diào)用了yield方法,意思是放棄當(dāng)前獲得的CPU時(shí)間片,回到就緒狀態(tài),這是與其他進(jìn)程處于同等競(jìng)爭(zhēng)狀態(tài),OS有可能會(huì)接著讓這個(gè)進(jìn)程進(jìn)入運(yùn)行狀態(tài),調(diào)用yield()的效果等價(jià)于調(diào)度程序認(rèn)為該線程已執(zhí)行了足夠的時(shí)間片從而需要轉(zhuǎn)到另一個(gè)線程。yield()只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。
3.4、當(dāng)線程進(jìn)入就緒狀態(tài),發(fā)現(xiàn)將要調(diào)用的資源被synchronized,獲取不到鎖標(biāo)記,將會(huì)立即進(jìn)入鎖池狀態(tài),等待獲取鎖標(biāo)記(這是的鎖池里也許已經(jīng)有了其他線程在等待獲取所標(biāo)記,這時(shí)它們處于隊(duì)列狀態(tài),即先到先得),一旦線程獲得鎖標(biāo)記后,就轉(zhuǎn)入就緒狀態(tài),等待OS分配時(shí)間片。
3.5、suspend()和resume()方法:兩個(gè)方法配套使用,suspend()使得線程進(jìn)入阻塞狀態(tài),并且不會(huì)自動(dòng)恢復(fù),必須被對(duì)應(yīng)的resume()調(diào)用,才能使得線程重新進(jìn)入可執(zhí)行狀態(tài)。典型的,suspend()和resume()被用在等待另一個(gè)線程產(chǎn)生的結(jié)果的情形:測(cè)試發(fā)現(xiàn)結(jié)果還沒(méi)有產(chǎn)生后,讓線程阻塞,另一個(gè)線程產(chǎn)生看了結(jié)果后,調(diào)用resume()使其恢復(fù)。
3.6、wait()和notify()方法:當(dāng)線程調(diào)用wait()方法后會(huì)進(jìn)入等待隊(duì)列(進(jìn)入這個(gè)狀態(tài)會(huì)釋放所占有的所有資源,與阻塞狀態(tài)不同),進(jìn)入這個(gè)狀態(tài)后,是不能自動(dòng)喚醒的,必須依靠其他線程調(diào)用notify()或notifyAll()方法才能被喚醒(由于notify()只是喚醒一個(gè)線程,但我們不能確定具體喚醒的是哪一個(gè)線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實(shí)際使用時(shí),一般都用notifyAll()方法,喚醒所有線程),線程被喚醒后會(huì)進(jìn)入鎖池,den
4、阻塞狀態(tài)
阻塞狀態(tài)是線程因?yàn)槟撤N原因放棄CPU使用權(quán),暫時(shí)停止運(yùn)行。直到線程進(jìn)入就緒狀態(tài),才有機(jī)會(huì)轉(zhuǎn)到運(yùn)行狀態(tài)。
阻塞的情況分三種:
4.1、等待阻塞:運(yùn)行的線程執(zhí)行wait()方法,該線程會(huì)釋放占用的所有資源,JVM會(huì)把該線程放入”等待池“中。進(jìn)入這個(gè)狀態(tài)后,是不能自動(dòng)喚醒的,必須依靠其他線程調(diào)用notify()或者notifyAll()方法才能被喚醒。
4.2、同步阻塞:運(yùn)行的線程在獲取對(duì)象的同步鎖時(shí),若該同步鎖被別的線程占用,則JVM會(huì)把該線程放入”鎖池“中。
4.3、其他阻塞:運(yùn)行的線程執(zhí)行了sleep()或join()方法,或者發(fā)出了i/o請(qǐng)求時(shí),JVM會(huì)把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時(shí)、join()等待線程終止或者超時(shí)、或者i/o處理完畢時(shí),線程重新轉(zhuǎn)入就緒狀態(tài)。
4.4、當(dāng)線程剛進(jìn)入可運(yùn)行狀態(tài)(注意,還沒(méi)運(yùn)行),發(fā)現(xiàn)將要調(diào)用的資源被synchroniza(同步),獲取不到鎖標(biāo)記,將會(huì)立即進(jìn)入鎖池狀態(tài),等待獲取鎖標(biāo)記(這時(shí)的鎖池里也許已經(jīng)有了其他線程在等待獲取鎖標(biāo)記,這時(shí)它們處于隊(duì)列狀態(tài),既先到先得),一旦線程獲得鎖標(biāo)記后,就轉(zhuǎn)入就緒狀態(tài),等待OS分配CPU時(shí)間片;
4.5. suspend() 和 resume()方法:兩個(gè)方法配套使用,suspend()使得線程進(jìn)入阻塞狀態(tài),并且不會(huì)自動(dòng)恢復(fù),必須其對(duì)應(yīng)的resume()被調(diào)用,才能使得線程重新進(jìn)入可執(zhí)行狀態(tài)。典型地,suspend()和 resume() 被用在等待另一個(gè)線程產(chǎn)生的結(jié)果的情形:測(cè)試發(fā)現(xiàn)結(jié)果還沒(méi)有產(chǎn)生后,讓線程阻塞,另一個(gè)線程產(chǎn)生了結(jié)果后,調(diào)用 resume()使其恢復(fù)。?
4.6、wait()和 notify() 方法:當(dāng)線程調(diào)用wait()方法后會(huì)進(jìn)入等待隊(duì)列(進(jìn)入這個(gè)狀態(tài)會(huì)釋放所占有的所有資源,與阻塞狀態(tài)不同),進(jìn)入這個(gè)狀態(tài)后,是不能自動(dòng)喚醒的,必須依靠其他線程調(diào)用notify()或notifyAll()方法才能被喚醒(由于notify()只是喚醒一個(gè)線程,但我們由不能確定具體喚醒的是哪一個(gè)線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實(shí)際使用時(shí),一般都用notifyAll()方法,喚醒有所線程),線程被喚醒后會(huì)進(jìn)入鎖池,等待獲取鎖標(biāo)記。
5、死亡狀態(tài)
線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。
二、進(jìn)程的狀態(tài)
進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。線程是CPU調(diào)度的基本單位。
一般來(lái)說(shuō),進(jìn)程有三個(gè)狀態(tài):
1、運(yùn)行態(tài)
進(jìn)程占用CPU,并在CPU上運(yùn)行。
2、就緒態(tài)
進(jìn)程已經(jīng)具備運(yùn)行條件,但是CPU還沒(méi)有分配過(guò)來(lái)。
3、阻塞態(tài)
進(jìn)程因等待某件事發(fā)生而暫時(shí)不能運(yùn)行。
上述的三種狀態(tài)之間轉(zhuǎn)換分為六種情況:
1、運(yùn)行——>就緒:主要是進(jìn)程占用CPU的時(shí)間過(guò)長(zhǎng),而系統(tǒng)分配給該進(jìn)程占用CPU的時(shí)間是有限的;在采用搶先式優(yōu)先級(jí)調(diào)度算法的系統(tǒng)中,當(dāng)有更高優(yōu)先級(jí)的進(jìn)程要運(yùn)行時(shí),該進(jìn)程就被迫讓出CPU,該進(jìn)程便由執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)。
2、就緒——>運(yùn)行:運(yùn)行的進(jìn)程的時(shí)間片用完,調(diào)度就轉(zhuǎn)到就緒隊(duì)列中選擇合適的進(jìn)程分配CPU
3、運(yùn)行——>阻塞:正在執(zhí)行的進(jìn)程因發(fā)生某等待事件而無(wú)法執(zhí)行,則進(jìn)程由執(zhí)行狀態(tài)變?yōu)樽枞麪顟B(tài),如發(fā)生了I/O請(qǐng)求
4、阻塞——>就緒:進(jìn)程所等待的事件已經(jīng)發(fā)生,就進(jìn)入就緒隊(duì)列
以下兩種狀態(tài)是不可能發(fā)生的:
1、阻塞——>運(yùn)行:即使給阻塞進(jìn)程分配CPU,也無(wú)法執(zhí)行,操作系統(tǒng)在進(jìn)行調(diào)度時(shí)不會(huì)從阻塞隊(duì)列進(jìn)行挑選,而是從就緒隊(duì)列中選取
2、就緒——>阻塞:就緒態(tài)根本就沒(méi)有執(zhí)行,談不上進(jìn)入阻塞態(tài)。
在一些系統(tǒng)中,又增加了一些新狀態(tài),如掛起狀態(tài),可運(yùn)行狀態(tài),深度睡眠狀態(tài),淺度睡眠狀態(tài),暫停狀態(tài),僵死狀態(tài)。
1、可運(yùn)行狀態(tài):運(yùn)行狀態(tài)和就緒狀態(tài)的合并,表示進(jìn)程正在運(yùn)行或準(zhǔn)備運(yùn)行,Linux 中使用TASK_RUNNING 宏表示可運(yùn)行狀態(tài)。
2、淺度睡眠狀態(tài):進(jìn)程正在睡眠(被阻塞),等待資源的到來(lái)是喚醒,也可以通過(guò)其他進(jìn)程信號(hào)或時(shí)鐘中斷喚醒,進(jìn)入運(yùn)行隊(duì)列。Linux 中使用TASK_INTERRUPTIBLE 宏表示此狀態(tài)。
3、深度睡眠狀態(tài):其和淺度睡眠基本類似,但不可被其他進(jìn)程信號(hào)或時(shí)鐘中斷喚醒。Linux 中使用TASK_UNINTERRUPTIBLE 宏表示此狀態(tài)。
4、暫停狀態(tài):進(jìn)程暫停執(zhí)行接受某種處理。Linux 使用TASK_STOPPED 宏表示此狀態(tài)。
5、僵死狀態(tài):進(jìn)程已經(jīng)結(jié)束但未釋放進(jìn)程控制塊(PCB),Linux 使用TASK_ZOMBIE 宏表示此狀態(tài)。
掛起狀態(tài):在執(zhí)行狀態(tài)的進(jìn)程通過(guò)掛起即可進(jìn)入就緒狀態(tài),如圖所示,就緒狀態(tài)和阻塞狀態(tài)都分為活動(dòng)態(tài)和靜止態(tài)。由活動(dòng)態(tài)向靜止態(tài)轉(zhuǎn)換就是通過(guò)掛起實(shí)現(xiàn)的。
引入掛起狀態(tài)的原因有:
1、終端用戶的請(qǐng)求。當(dāng)終端用戶在自己的程序運(yùn)行期間發(fā)現(xiàn)有可疑問(wèn)題時(shí),希望暫時(shí)使自己的程序靜止下來(lái)。亦即,使正在執(zhí)行的進(jìn)程暫停執(zhí)行;若此時(shí)用戶進(jìn)程正處于就緒狀態(tài)而未執(zhí)行,則該進(jìn)程暫不接受調(diào)度,以便用戶研究其執(zhí)行情況或?qū)Τ绦蜻M(jìn)行修改。我們把這種靜止?fàn)顟B(tài)稱為掛起狀態(tài)。
2、父進(jìn)程請(qǐng)求。有時(shí)父進(jìn)程希望掛起自己的某個(gè)子進(jìn)程,以便考查和修改該子進(jìn)程,或者協(xié)調(diào)各子進(jìn)程間的活動(dòng)。
3、負(fù)荷調(diào)節(jié)的需要。當(dāng)實(shí)時(shí)系統(tǒng)中的工作負(fù)荷較重,已可能影響到對(duì)實(shí)時(shí)任務(wù)的控制時(shí),可由系統(tǒng)把一些不重要的進(jìn)程掛起,以保證系統(tǒng)能正常運(yùn)行。
4、操作系統(tǒng)的需要。操作系統(tǒng)有時(shí)希望掛起某些進(jìn)程,以便檢查運(yùn)行中的資源使用情況或進(jìn)行記賬。
總結(jié)
以上是生活随笔為你收集整理的线程的状态、进程的状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 北上广深的程序员,房子在向你们招手了!
- 下一篇: 非x面容解锁插件ios13_iOS13.