1. 程式人生 > >守護線程與非守護線程的區別

守護線程與非守護線程的區別

感覺 stat test 本質 殺死 知識 所有 調用 存在

守護線程與非守護線程

最近在看多線程的Timer章節,發現運用到了守護線程,感覺Java的基礎知識還是需要補充。

Java分為兩種線程:用戶線程和守護線程

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

守護線程和用戶線程的沒啥本質的區別:唯一的不同之處就在於虛擬機的離開:如果用戶線程已經全部退出運行了,只剩下守護線程存在了,虛擬機也就退出了。 因為沒有了被守護者,守護線程也就沒有工作可做了,也就沒有繼續運行程序的必要了。

將線程轉換為守護線程可以通過調用Thread對象的setDaemon(true)方法來實現。在使用守護線程時需要註意一下幾點:

(1) thread.setDaemon(true)必須在thread.start()之前設置,否則會跑出一個IllegalThreadStateException異常。你不能把正在運行的常規線程設置為守護線程。

(2) 在Daemon線程中產生的新線程也是Daemon的。

(3) 守護線程應該永遠不去訪問固有資源,如文件、數據庫,因為它會在任何時候甚至在一個操作的中間發生中斷。

使用:

Runnable tr=new TestRunnable();

Thread thread=new Thread(tr);

thread.setDaemon(true); //設置守護線程

thread.start(); //開始執行分進程

守護線程與非守護線程的區別