當我們在Java中創建一個線程,缺省狀態下它是一個User線程,如果該線程運行,JVM不會終結該程序。當一個線被標記為守護線程,JVM不會等待其結束,只要所有用戶(User)線程都結束,JVM將終結程序及相關聯的守護線程。
Java中可以用 Thread.setDaemon(true) 來創建一個守護線程。咱們看一個Java中有關守護線程的例子。
1 public class JavaDaemonThread { 2 3 public static void main(String[] args) throws InterruptedException { 4 Thread dt = new Thread(new DaemonThread(), "dt"); 5 dt.setDaemon(true);//譯者注:此次將User線程變為Daemon線程 6 dt.start(); 7 //continue program 8 Thread.sleep(30000); 9 System.out.println("Finishing program"); 10 } 11 12 } 13 14 class DaemonThread implements Runnable{//譯者注:此類雖類名是為Daemon線程,其實為User線程 15 16 @Override 17 public void run() { 18 while(true){ 19 processSomething(); 20 } 21 } 22 23 private void processSomething() { 24 try { 25 System.out.println("Processing daemon thread"); 26 Thread.sleep(5000); 27 } catch (InterruptedException e) { 28 e.printStackTrace(); 29 } 30 } 31 32 }
當你運行該程序,JVM 在main()方法中先創建一個用戶線程,再創建一個守護線程。當main()方法結束后,程序終結,同時JVM也關閉守護線程。
下面就是上述程序執行的結果:
1 Processing daemon thread 2 Processing daemon thread 3 Processing daemon thread 4 Processing daemon thread 5 Processing daemon thread 6 Processing daemon thread 7 Finishing program
如果我們不將一個線程以守護線程方式來運行,即使主線程已經執行完畢,程序也永遠不會結束,可以嘗試把上述將線程設為守護線程的那句注釋掉,重新運行看看結果:
通常我們創建一個守護線程,對於一個系統來說在功能上不是主要的。例如抓取系統資源明細和運行狀態的日志線程或者監控線程。
原文鏈接: Javarevisited 翻譯: TonySpark
譯文鏈接: http://www.cnblogs.com/tonyspark/p/3720640.html
[ 轉載請保留原文出處、譯者和譯文鏈接。]