線程的狀態(tài)
線程有如下6種狀態(tài):
New
(新創(chuàng)建 )
Runnable
(可運行)
Blocked
(被阻塞)
Waiting
(等待)
Timed waiting
(計時等待)
Terminated
(被終止)
其中,要獲取一個線程當(dāng)前的狀態(tài),可以調(diào)用getState 方法。
java相關(guān)視頻推薦:java視頻
下面,對每種狀態(tài)進行解釋
1.新創(chuàng)建線程(New)
當(dāng)我們使用new操作符來創(chuàng)建了一個線程時,如使用new Thread(r)時,線程還未開始運行,線程中的代碼也沒有開始執(zhí)行,此時就成為New狀態(tài)。
2.可運行線程(Runnable)
當(dāng)我們對一個線程執(zhí)行start()方法后,就會啟動該線程。但是注意,一個處于可運行狀態(tài)的線程可能正在運行也可能沒有運行,這時取決于操作系統(tǒng)的時間片調(diào)度。搶占式調(diào)度系統(tǒng)會給每一個線程分配一個時間片來運行,在時間片使用完后,操作系統(tǒng)就會剝奪它運行的權(quán)力,并更根據(jù)優(yōu)先級選擇下一個要運行的線程。
3.被阻塞、等待狀態(tài)(Blocked、waiting、Timed waiting)
當(dāng)一個線程處于阻塞和等待狀態(tài)時,它不做任何工作,也不執(zhí)行任何代碼。直到操作系統(tǒng)重新激活它。
當(dāng)一個線程試圖獲取一個內(nèi)部對象鎖,而這個鎖又被其它線程持有時,該線程就進入阻塞狀態(tài),當(dāng)其它線程釋放這個鎖后,并且線程調(diào)度器允許該線程持有它時,該線程將會變成非阻塞狀態(tài)。
當(dāng)線程等待另一個線程通知調(diào)度器一個條件時,它自己就進入等待狀態(tài),再調(diào)用Object.wait方法或者Thread.join方法時,就會出現(xiàn)這種情況。被阻塞狀態(tài)和等待狀態(tài)時大有不同的。
有幾個方法有一個超時參數(shù)。調(diào)用它們導(dǎo)致線程進入計時等待狀態(tài)這一狀態(tài)將一直保存到超時期滿或者接收到適當(dāng)?shù)耐ㄖ?。帶有超時參數(shù)的方法有:Thread.sleep
和 Object.wait
、Thread.join
、 Lock,tryLock
以及 Condition.await
的計時版。
4.被終止的線程
線程終止有兩種原因:
因為run()方法執(zhí)行完畢正常退出
因為一個沒有捕獲的異常而終止了run方法導(dǎo)致意外死亡
5.總結(jié)
相關(guān)文章教程推薦:java編程入門