Java並發總結
什麽是線程?
一個程序同時執行多個任務,每個任務稱為一個線程(thread)。可以同時運行一個以上線程的程序被成為多線程程序(multithread)
創建一個線程並執行
new Thread().start();
中斷線程
當線程的run方法執行方法體中最後一條語句後,並經由執行return語句返回時,或者出現了在方法中沒有捕獲的異常時,線程將終止。
沒有可以強制線程終止的方法,但interrupt方法可以用來請求終止線程。
線程狀態
線程有6種狀態
New(新建)
Runnable(可運行)
Blocked(被阻塞)
Waiting(等待)
Timed waiting(計時等待)
New(新建)
當用new創建一個新線程對象時,線程處於新建狀態
Thread t = new Thread();
Runnable(可運行)
一旦調用start(),線程處於runnable狀態,可能正在運行,也可能沒在運行,這取決於系統給線程提供運行的時間。
搶占式調度系統會給每一個可運行線程一個時間片來執行任務,當時間片用完,操作系統剝奪該線程的運行權,並給另一線程運行機會,當選擇下一個線程時,操作系統考慮線程的優先級。
Blocked(被阻塞)
當一個線程試圖獲得一個內部的對象鎖,而鎖被其他線程持有,則該線程進入阻塞狀態
Waiting(等待)
Timed waiting(計時等待)
有幾個參數有一個超時參數,調用它們導致線程進入計時等待狀態。這一狀態將一直保持到超時期滿或者接到適當通知
Terminated(終止)
線程因如下兩個原因之一而終止:
因run方法正常退出而自然死亡
因為一個沒有捕獲的異常終止了run方法而意外死亡
線程屬性
線程優先級
每個線程有一個優先級。默認情況下,一個線程繼承自父線程的優先級,調用setPriority()設置。線程優先級高度依賴於系統,Windows有7個優先級,Oracle為Linux提供的JVM線程優先級被忽略
守護線程
t.setDaemon(true) 可以將線程轉換為一個守護線程。守護線程的唯一用途是為其他線程提供服務
當只剩下守護線程時,JVM就退出了
線程組
線程組是一個可以統一管理的線程集合,默認情況下,創建的所有線程屬於相同的集合,但也可以創建其他組
處理未捕獲異常處理器
線程的run方法不能拋出受查異常,但非受查異常會導致線程終止。在線程死亡前,該異常被傳遞到一個用於未捕獲異常的處理器。
該處理器實現了Thread.UncaughtExceptionHandler接口
如果不為獨立的線程安裝處理器,此時的處理器就是該線程的ThreadGroup對象
競爭條件(race condition),兩個或兩個以上的線程需要共享對同一數據的存儲。
Java中有兩種機制防止代碼塊受並發訪問的幹擾。synchronized關鍵字,ReentrantLock類。
Java並發總結