Java多線程: 線程(Thread)

進程

進程是一個獨立功能的程序,是系統進行資源分配和調度的一個獨立單位,重點是系統進行調度和分配的獨立單位。

線程

線程是進程中的一個任務,是CPU分派和調度的基本單位。

線程和進程的區別

  • 一個進程中可以有多個線程,但最少有一個線程,也就是經常說的主線程。一個線程只能屬於一個進程。
  • 每個進程都有屬於自己的資源,進程間的資源不共享。同一進程中的線程間是共享本進程的資源。
  • 每個進程都有自己的獨立地址空間,進程間的地址空間不共享。進程內的線程共享本進程內的地址空間。
  • 一個進程崩潰後,在系統保護機制下不會影響其它進程,一個線程崩潰後,線程所屬的進程就會死掉。
  • 線程和進程都可以執行併發,既多線程和多進程。

線程的狀態

線程可以根據其不同條件分爲六種狀態,

  1. 新建狀態(new)
  2. 可運行狀態(runnable)
  3. 阻塞狀態(blocked)
  4. 等待狀態(waiting)
  5. 計時等待狀態(Timed waiting)
  6. 終止狀態(Terminated)
新建狀態

當一個線程被new 實例化,還沒有調用線程start方法,線程的run方法還沒有執行,線程處於新建狀態。

可運行狀態

一旦調用線程的start方法,線程就處於可運行狀態。一個可運行的線程可能是正在運行也可能是沒有正在運行,這取決於操作系統給線程提供的運行時間。操作系統會根據不同的處理方式(搶佔式和協作式)來控制線程的控制權。

阻塞狀態

當線程試圖去獲取內部對象鎖,該鎖被其它線程持有,則該線程進入阻塞狀態。當該鎖被所持有的線程釋放後,並且操作系統允許該線程持有鎖時,線程進入非阻塞狀態。

等待狀態

當線程等待另一個線程通知系統調度一個條件時,該線程進入等待狀態。

計時等待

有幾個方法是有一個超時參數的,調用它們的線程進入計時等待狀態。這個狀態持續到超時期滿或者接收到適當的通知後結束。帶超時參數的等待方法有Thread.sleep、object.wait、Thread.join、Lock.tryLock和Condition.await的計時版方法。

終止狀態

線程因以下兩個原因被終止。

  • run正常退出而自然終止。
  • 因爲一個沒有捕獲的異常導致run方法終止而意外終止。

線程的屬性

線程的優先級

每個線程都有優先級,一般都情況下,每當線程調度器有機會選擇新線程時,會優先選擇優先級高的線程。但是線程的優先級高度依賴系統。

  • 線程的優先級通過setPriority(int newPriority)方法設置,設置範圍爲MIN_PRIORITY (在Thread中定義爲1)和MAX_PRIORITY(在Thread中定義爲10)之間,一般默認的爲NORMAL_PRIORITY(在Thread中定義爲5)。
  • 操作系統的優先級 windows系統有7個優先級,在sun爲lunx提供的java虛擬機,線程的優先級被忽略,所有線程的優先級相同。
守護線程

通過調用線程的setDaemon(true)方法吧線程設置爲守護線程。守護線程的作用是爲其它線程提供服務。例如java的垃圾回收(GC)線程。

  • 當程序只剩下守護線程時,程序會退出。
  • 守護線程永遠不應該訪問固有資源,如文件,數據庫等,因爲它會在任何時候發生中斷。
未捕獲異常處理器

每個線程都可以設置一個未捕獲異常處理器,通過調用setUncaughtExceptionHandler()設置。

  • 通過實現Thread.UncaughtExceptionHandler接口,實現線程都未捕獲異常處理器,裏面有uncaughtException(Thread,Throwable)。
  • 可以通過調用Thread的setDefaultUncaughtExceptionHandler靜態方法爲所有線程提供一個默認的未捕獲異常處理器。
發佈了6 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章