一、線(xiàn)程有哪些狀態(tài)
線(xiàn)程的全部狀態(tài)如下:
born(新生),runnable(可運行),running(運行),waiting(等待),sleeping(睡眠),blocked(阻塞),dead(死亡)。
二、狀態(tài)之間的關(guān)系:
當一個(gè)Runnable類(lèi)型對象的構造函數第一次被調用時(shí),一個(gè)新的的線(xiàn)程就誕生了。除非我們在構造函數中調用了start方法,否則這個(gè)新線(xiàn)程將作為一個(gè)新對象呆在內存中基本上什么事情也不做。當我們在構造函數或者main函數中對這個(gè)線(xiàn)程調用了start方法,或者這個(gè)線(xiàn)程在程序的其他任何位置使他自己的狀態(tài)由born改變?yōu)閞unnable的線(xiàn)程之后,調度程序就可以把處理器分配給這個(gè)線(xiàn)程。
把處理器分配給一個(gè)處于runnable的線(xiàn)程之后,這個(gè)線(xiàn)程的狀態(tài)就變成了running。如果一個(gè)處于running狀態(tài)的線(xiàn)程能夠運行到結束,她的狀態(tài)就會(huì )變?yōu)閐ead。否則,這個(gè)線(xiàn)程的命運就取決于當前是否還有其他線(xiàn)程等待處理器運行。如果這個(gè)線(xiàn)程在當前所有處于runnable狀態(tài)的線(xiàn)程中具有最高優(yōu)先級那么他就就會(huì )繼續執行,除非這個(gè)線(xiàn)程被運行程序的平臺劃分為時(shí)間片。當線(xiàn)程被劃分為時(shí)間片時(shí),一個(gè)處于running狀態(tài)的線(xiàn)程將分配到一個(gè)固定間隔的處理器時(shí)間--quantum。具有相同優(yōu)先級的線(xiàn)程的時(shí)間片調度將導致這些線(xiàn)程被輪流執行。如果正在執行的線(xiàn)程的代碼包含了yield方法,那么這個(gè)處于running狀態(tài)的線(xiàn)程將停止運行,并把處理器交給其他進(jìn)程。
一個(gè)正在運行的線(xiàn)程可以通過(guò)調用sleep()方法轉換為sleep狀態(tài)。如果一個(gè)線(xiàn)程包含了很長(cháng)的循環(huán),在循環(huán)的每次迭代之后把這個(gè)線(xiàn)程切換到sleep狀態(tài)是一種很好的策略,他可以保證其他線(xiàn)程不必等待很長(cháng)時(shí)間才能輪到處理器執行。當一個(gè)正在運行的線(xiàn)程進(jìn)入到sleep狀態(tài)時(shí),其中一個(gè)等待線(xiàn)程就會(huì )切換到處理器。在很長(cháng)的循環(huán)中,我們也可以使用yield方法來(lái)代替sleep方法。
在run方法的I/O操作期間,處理器無(wú)法從一個(gè)線(xiàn)程切換到另外一個(gè)線(xiàn)程,及時(shí)時(shí)使用時(shí)間片的調度策略也是如此。我們把這種情況稱(chēng)為線(xiàn)程由于I/O操作而阻塞。