1. 程式人生 > >Java並發總結

Java並發總結

locked wait 相同 參數 進入 tex 可能 實現 試圖


什麽是線程?

一個程序同時執行多個任務,每個任務稱為一個線程(thread)。可以同時運行一個以上線程的程序被成為多線程程序(multithread)

創建一個線程並執行

new Thread().start();


中斷線程

當線程的run方法執行方法體中最後一條語句後,並經由執行return語句返回時,或者出現了在方法中沒有捕獲的異常時,線程將終止。

沒有可以強制線程終止的方法,但interrupt方法可以用來請求終止線程。


線程狀態

線程有6種狀態

New(新建)
Runnable(可運行)
Blocked(被阻塞)
Waiting(等待)
Timed waiting(計時等待)

Terminated(終止)

New(新建)
當用new創建一個新線程對象時,線程處於新建狀態
Thread t = new Thread();

Runnable(可運行)
一旦調用start(),線程處於runnable狀態,可能正在運行,也可能沒在運行,這取決於系統給線程提供運行的時間。

搶占式調度系統會給每一個可運行線程一個時間片來執行任務,當時間片用完,操作系統剝奪該線程的運行權,並給另一線程運行機會,當選擇下一個線程時,操作系統考慮線程的優先級。

Blocked(被阻塞)
當一個線程試圖獲得一個內部的對象鎖,而鎖被其他線程持有,則該線程進入阻塞狀態

Waiting(等待)

當線程等待另一個線程通知調度器一個條件時,進入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並發總結