多線程 -- 線程相關(guān)基礎(chǔ)
1. 線程狀態(tài)
- New (新生): 創(chuàng)建進(jìn)程之后, 還未啟動之前;
- Runable (可運(yùn)行): 調(diào)用start方法之后;
- Blocked (被阻塞)
- Waitting (等待)
- Time waiting (計時等待)
- Terminated (中止退出)
1.1 新生狀態(tài)
實(shí)例化一個線程后, 線程還沒運(yùn)行之前; 即創(chuàng)建線程 new Thread()
, 未調(diào)用start()
方法之前都是新生狀態(tài)
1.2 可運(yùn)行狀態(tài)
一旦調(diào)用start方法, 線程就進(jìn)入了runnable狀態(tài)了; 此時線程可能在等待運(yùn)行(等待系統(tǒng)分配cpu資源), 或者正在運(yùn)行;
有些文章將等待運(yùn)行和正在運(yùn)行分為2種狀態(tài)(runnable和running狀態(tài)), 但是Java規(guī)范中,都是作為runnale狀態(tài);
1.3 被阻塞線程和等待線程
當(dāng)線程處于被阻塞或者等待狀態(tài)時, 將暫時停止活動; 此時不運(yùn)行任何代碼且消耗最少的資源, 直到線程調(diào)度器重新激活它;
- 當(dāng)一個線程試圖獲取對象的內(nèi)部鎖, 而該鎖被其他對象持有時, 線程進(jìn)入阻塞狀態(tài);
- 當(dāng)線程等待另外一個線程的通知調(diào)度器的一個條件時, 進(jìn)入等待狀態(tài); 例如調(diào)用
Object.wait
方法或者Thread.join
方法, 或者是等待java.util.concurrrent
庫中的Lock或Condition時; - 等待方法設(shè)置了超時參數(shù),即進(jìn)入了計時等待狀態(tài); 例如
Thread.sleep
方法,Objec.wait(100)
等
1.3 中止?fàn)顟B(tài)
下面2個原因之一使進(jìn)程進(jìn)入中止?fàn)顟B(tài)
- run方法運(yùn)行結(jié)束,正常退出而自然死亡
- 由于沒有捕獲的異常中止了run方法而以外死亡
線程狀態(tài)可以通過
Thread.getState
方法獲取;
線程優(yōu)先級
每一個線程,有一個默認(rèn)的優(yōu)先級; 可以使用setPriority
方法設(shè)置;