OneCoder(苦逼Coder)原创,转载请务必注明出处: http://www.coderli.com/archives/daemon-thread-plain-words/ 

关于“白话”:偶然想到的词,也许有一天能成为一个系列。目的就是用简洁,明快的语言来告诉您,我所知道的一切。

 
Java中的线程分两类,用户线程和守护线程。
  1. Thread commonThread = new Thread("Common Thread"); 

这样就是用户线程。

  1. Thread daemonThread = new Thread("Daemon Thread"); 
  2. daemonThread.setDaemon(true); 

这样就是守护线程。

起了“守护”线程这么动听的名字,自然要起到“守护”的作用。就好比男人要守护妹子。

守护线程的作用,按照网上的说法是:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
 
说白了就是妹子没了,男人也就自尽了。分情况写几个例子,一跑便知。
 
  • 两个妹子 - 互不想干,你挂你的,我挂我的

 

  1. /** 
  2.      * 测试两个用户线程的情况 
  3.      *  
  4.      * @author lihzh(OneCoder) 
  5.      * @date 2012-6-25 下午10:07:16 
  6.      */ 
  7.     private static void twoCommonThread() { 
  8.         String girlOneName = "Girl One"
  9.         Thread girlOne = new Thread(new MyRunner(3000, girlOneName), girlOneName); 
  10.         String girlTwoName = "Girl Two"
  11.         Thread girlTwo = new Thread(new MyRunner(5000, girlTwoName), girlTwoName); 
  12.         girlOne.start(); 
  13.         System.out.println(girlOneName + "is starting."); 
  14.         girlTwo.start(); 
  15.         System.out.println(girlTwoName + "is starting"); 
  16.     } 
  17.  
  18.     private static class MyRunner implements Runnable { 
  19.          
  20.         private long sleepPeriod; 
  21.         private String threadName; 
  22.          
  23.         public MyRunner(long sleepPeriod, String threadName) { 
  24.             this.sleepPeriod = sleepPeriod; 
  25.             this.threadName = threadName; 
  26.         } 
  27.         @Override 
  28.         public void run() { 
  29.             try { 
  30.                 Thread.sleep(sleepPeriod); 
  31.             } catch (InterruptedException e) { 
  32.                 e.printStackTrace(); 
  33.             } 
  34.             System.out.println(threadName + " has finished."); 
  35.         } 
  36.     } 

 

 

开始都活着。

3秒后,妹子1挂了,妹子2活的好好的,她的寿命是5秒。

  • 一妹子一王子
  1. /** 
  2.  * 测试一个用户一个守护线程 
  3.  *  
  4.  * @author lihzh(OneCoder) 
  5.  * @date 2012-6-25 下午10:22:58 
  6.  */ 
  7. private static void oneCommonOneDaemonThread() { 
  8.     String girlName = "Girl"
  9.     Thread girl = new Thread(new MyRunner(3000, girlName), girlName); 
  10.     String princeName = "Prince"
  11.     Thread prince = new Thread(new MyRunner(5000, princeName), princeName); 
  12.     girl.start(); 
  13.     System.out.println(girlName + "is starting."); 
  14.     prince.setDaemon(true); 
  15.     prince.start(); 
  16.     System.out.println(prince + "is starting"); 

 

开始快乐的生活着,妹子能活3秒,王子本来能活5秒。

但是3秒后,妹子挂了,王子也殉情了。

 

你可能会问,如果王子活3秒,妹子能活5秒呢。我只能说,虽然你是王子,该挂也得挂,妹子还会找到其他高富帅的,懂?

看,王子已经挂了。

  • 两个王子
  1.    /** 
  2.  * 测试两个守护线程 
  3.  *  
  4.  * @author lihzh(OneCoder) 
  5.  * @date 2012-6-25 下午10:29:18 
  6.  */ 
  7. private static void twoDaemonThread() { 
  8.     String princeOneName = "Prince One"
  9.     Thread princeOne = new Thread(new MyRunner(5000, princeOneName), princeOneName); 
  10.     String princeTwoName = "Prince Two"
  11.     Thread princeTwo = new Thread(new MyRunner(3000, princeTwoName), princeTwoName); 
  12.     princeOne.setDaemon(true); 
  13.     princeOne.start(); 
  14.     System.out.println(princeOneName + "is starting."); 
  15.     princeTwo.setDaemon(true); 
  16.     princeTwo.start(); 
  17.     System.out.println(princeTwoName + "is starting"); 

 

 

我只能说,没有妹子,没有活着的理由,直接就都挂了。
 
现在,你懂守护线程了吗?