当我们在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
[ 转载请保留原文出处、译者和译文链接。]