執行緒(Thread)
執行緒區別於程式
- 程式:是一個程式的執行過程,是系統中程式的基本單位。執行一個程式即執行一個程式,一個程式對應一個程式,二者建立於銷燬等同。
- 執行緒:與程式相似,執行緒比程式的執行單位更小,一個程式中可以建立多個執行緒,多個執行緒可以共享同一個記憶體空間和系統資源。
併發和並行
- 並行:多個 cpu 例項或者多臺機器同時執行一段處理邏輯程式碼。多核 cpu,每個 cpu 有自己運算器,在多個 cpu 中可以同時執行
- 併發:多個任務交替執行,多執行緒單核 cpu 是順序執行。
執行緒狀態
- 新生執行緒 使用操作符
new
例如new Thread(r)
這裡只是建立一個執行緒,並沒有開始執行執行緒 - 可執行執行緒 標誌是呼叫
start()
方法 - 被阻塞執行緒
- 等待執行緒
- 被終止執行緒
被阻塞和等待,當處於這三個狀態時,程式不執行任何程式碼,直到執行緒排程器重新啟用,
- 執行緒排程器:會決定哪個執行緒從等待或者被阻塞狀態中挑選出來,何時把某個執行緒送回等待執行狀態.它會決定某個執行緒執行多久。無法去控制排程,它是不確定。排程不能保證任何執行時間和順序,不能期待它完全平均分配執行,可以用
sleep()
來保證時間,向該方法傳入的時間單位為毫秒。
執行緒被終止的兩個原因:
-
run
方法的正常退出而自然死亡 - 一個沒有捕獲的異常終止了
run
方法而意外死亡 - 呼叫
stop
方法也可殺死一個執行緒,該方法丟擲 ThreadDeath 錯誤物件,不建議使用stop
,該方法已經過時
執行緒屬性
執行緒優先順序
守護執行緒
執行緒組
處理未捕獲異常處理器
執行緒優先順序
預設情況下執行緒繼承它的福執行緒的優先順序,想改變該執行緒的優先順序就需要呼叫 setPriority(int newPriority)
來設定執行緒的優先順序。newPriority
取值範圍為 MIN_PRIORITY 到 MAX_PRIORITY 之間(1 ~ 10),通常情況下取值為 NORM_PRIORITY (5)
守護執行緒
為非守護執行緒提供服務的一個執行緒,例如一個程式中如果只剩下守護執行緒時,該程式就該終止執行,守護執行緒是一個程式結束的最後一步。使用 setDaemon(boolean isDaemon)
設定守護執行緒。
處理未捕獲異常處理器
執行緒執行完 run
方法會正常退出。如果該執行緒中發生了沒有捕獲的異常,就會造成執行緒死亡,異常退出。解決方法是線上程死亡之前將異常交給一個用於未捕獲異常的處理器。JVM 為我們提供了執行緒的未捕獲異常處理器,通過 Thread 的 setUncaughtExceptionHandler(UncaughtExceptionHandler eh)
來設定,為所有執行緒新增一個處理器。
執行緒組
如果上述過程沒有發生,沒有為所有執行緒新增處理器,那麼預設的處理器就是該執行緒的 ThreadGroup 物件。執行緒組是一個可以統一管理的執行緒集合,預設情況下建立的所有執行緒屬於相同的執行緒組。