1. 程式人生 > >Java的守護執行緒和非守護執行緒

Java的守護執行緒和非守護執行緒

一、守護執行緒

        java分為兩種執行緒:使用者執行緒守護執行緒

        守護執行緒是指在程式執行的時候在後臺提供一種通用服務的執行緒,比如垃圾回收執行緒就是一個很稱職的守護者,並且這種執行緒並不屬於程式中不可或缺的部分。因此,當所有的非守護執行緒結束時,程式也就終止了,同時會殺死程序中的所有守護執行緒。反過來說,只要任何非守護執行緒還在執行,程式就不會終止。

        守護執行緒和使用者執行緒的基本沒什麼本質的區別,唯一的不同之處就在於虛擬機器的離開。如果使用者執行緒已經全部退出執行了,只剩下守護執行緒存在了,虛擬機器也就退出了。 因為沒有了被守護者,守護執行緒也就沒有工作可做了,也就沒有繼續執行程式的必要了。

例如: 垃圾回收執行緒就是一個經典的守護執行緒,當我們的程式中不再有任何執行的Thread,程式就不會再產生垃圾,垃圾回收器也就無事可做,所以當垃圾回收執行緒是JVM上僅剩的執行緒時,垃圾回收執行緒會自動離開。它始終在低級別的狀態中執行,用於
實時監控和管理系統中的可回收資源。

        將執行緒轉換為守護執行緒可以通過呼叫Thread物件的setDaemon(true)方法來實現。在使用守護執行緒時需要注意一下幾點:

  • (1) thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常,不能把正在執行的       常規執行緒設定為守護執行緒。
  • (2) 在Daemon執行緒中產生的新執行緒也是Daemon的。
  • (3) 守護執行緒應該永遠不去訪問固有資源,如檔案、資料庫,因為它會在任何時候甚至在一個操作的中間發生中斷。

補充說明:
定義:守護執行緒--也稱“服務執行緒”,在沒有使用者執行緒可服務時會自動離開。
優先順序:守護執行緒的優先順序比較低,用於為系統中的其它物件和執行緒提供服務。
設定:通過setDaemon(true)來設定執行緒為"守護執行緒",將一個使用者執行緒設定為守護執行緒的方式是線上程物件建立之前用執行緒對               象的setDaemon方法。
生命週期:守護程序(Daemon)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。也就是說守護執行緒不依賴於終端,但是依賴於系統,與系統“同生共死”。Java的守護執行緒是當JVM中所有的執行緒都是守護執行緒的時候,JVM就可以退出了;如果還有一個或以上的非守護執行緒則JVM不會退出。

二、守護執行緒使用場景

    守護執行緒的典型代表是垃圾回收,這是很多人說守護程序非常有用的理由,但實際上守護程序在使用者開發上的應用場景幾乎用處不大,可能的應用場景:

  • 記憶體資源或者執行緒的管理,但是非守護執行緒也可以做
  • 守護執行緒負責一個可以將當前的JVM退出的功能,即將非damon的執行緒都退出,然後jvm自動退出,感覺用的也非常少,可以直接通知相關執行緒退出不就可以了,考慮設計上優雅一些,可能有點好處。