1、前言:
2、狀態概述
3、狀態詳述
3.一、
初始狀態(New)start()
方法進入就緒狀態。new
關鍵字創建一個線程對象後,該線程對象就處於新生狀態。3.二、
就緒狀態(Runnable)描述java
就緒狀態並非執行狀態,當系統選定一個等待執行的Thread
對象後,它就會進入執行狀態。安全
run()
方法條件多線程
1. 新建線程:調用**start()**方法,進入就緒狀態; 2. 阻塞線程:阻塞解除,進入就緒狀態; 當前線程sleep()方法結束, 其餘線程join結束,等待用戶輸入完畢,某個線程拿到對象鎖, 這些線程也將進入就緒狀態。 3. 運行線程:當前線程時間片用完了,調用**yield()**方法,直接進入就緒狀態; 4. 運行線程:JVM將CPU資源從本線程切換到其餘線程。
3.三、
運行狀態(Running)描述 :處於運行狀態的線程最爲複雜。線程
run()
方法中的代碼,直到調用其餘方法而終止或等待某資源而阻塞或完成任務而死亡線程從運行狀態變爲阻塞狀態的條件code
sleep()
方法主動放棄所佔用的系統資源阻塞式IO
方法,在該方法返回以前,該線程被阻塞notify()
)⑤、程序調用了線程的suspend()
方法將線程掛起對象
suspend()
容易致使死鎖,程序應該儘可能避免使用該方法線程從運行狀態變爲死亡狀態的條件生命週期
run()
方法執行完,stop()、desyory()
3.四、
阻塞狀態 (Blocked)描述隊列
synchronized
關鍵字修飾的方法或代碼塊(獲取鎖)時的狀態條件事件
1. 執行sleep(int millsecond)方法,使當前線程休眠,進入阻塞狀態。 當指定的時間到了後,線程進入就緒狀態。 2. 執行wait()方法,使當前線程進入阻塞狀態。當使用nofity()方法喚醒這個線程後, 它進入就緒狀態。 3. 線程運行時,某操做會阻塞,eg:執行IO流操做(read()/write()方法自己就是阻塞的方法)。 只有當引發該操做阻塞的緣由消失後,線程進入就緒狀態。 4. join()線程聯合: 當某個線程等待另外一個線程執行結束後,才能繼續執行時, 使用join()方法。
附:內存
sleep()方法,線程是抱着資源睡覺(不釋放資源)。
分類
- **等待阻塞:**運行狀態的線程執行 `wait()`方法,使線程進入到**等待阻塞**狀態。 - **同步阻塞:**線程在獲取 `synchronized` 同步鎖**失敗**(由於同步鎖被其餘線程佔用)。 - **其餘阻塞:** - 經過調用線程的 `sleep()` 或 `join()` 發出了 `I/O` 請求時,線程就會進入到阻塞狀態。 - 當`sleep()` 狀態超時,`join()` 等待線程終止或超時,或者 `I/O` 處理完畢,線程從新轉入就緒狀態。
3.五、
死亡狀態 (Terminated)描述
java.lang.IllegalThreadStateException
異常緣由
1.正常運行的線程完成了它run()方法內的所有工做 2.線程被強制終止,如經過執行stop()或destroy()方法來終止一個線程。 (注:stop()、destroy()方法已經被JDK廢棄,不推薦使用,不安全)。 3.線程拋出未捕獲的異常
4、續...