java多线程中,有一种特殊的线程叫做守护线程,关键词是Deamon。

我们在平时的书上都有介绍过,但是很少有用代码来讲的。我们往往记住的是:

守护线程是一般是用于辅助的,提供一些后台处理的理想方法,他们只是在支持其他非守护线程的时候才是需要的。

 

理解的深一点的,可以这么讲,守护线程的生命是和mian关联在一起的,如果man方法用完了,主线程死掉了,那么

守护线程就会陪着去送命,也会死掉的。而如果不是守护线程的话是不会这样的。

下面我们来看下代码的吧:

 

首先创建一个线程.守护线程并不是在创建线程的时候指定的,这其实和设定线程的名字是一样的,要再线程开始的去指定的。

 

 

package endual;

public class Daemon extends Thread{

	public void run () {
		
		System.out.println("entering run()");
		
		try {
			System.out.println("in run() - currentThread()=" + 
					Thread.currentThread());
			
			while (true) {
				try {
					Thread.sleep(500) ;
				} catch (Exception e) {
					// TODO: handle exception
				}
				System.out.println("in run()--  woke up again");
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			System.out.println("leanving run()");
		}
		
	}
	
}

 

 

main的测试类(这个时候,不是守护线程)

package endual;

public class MainApp {

    /**
     * 标记为守护的线程将以全新的方式终止。守护线程用于后台的支持任务,而且仅仅在普通的,非守护线程
     * 仍然需要运行的时候才需要的。当VM检测仅仅剩下一个守护线程的时候,就会退出的。如果非守护线程仍然还
     * 存活着,VM就不会退出的,守护线程提供了一种管理某些后台处理的理想的方法,他们只是在支持其他非守护线程
     * 时才需要的
     * @param args
     */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("enter main()");
		Daemon de = new Daemon() ;
		//de.setDaemon(true) ; //设置成为了daemon线程,设置成为守护线程
		de.start() ;
		
		try {
			Thread.sleep(3000) ;
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		System.out.println("leaving main(0");
	}

}

 

结果是:

enter main()
entering run()
in run() - currentThread()=Thread[Thread-0,5,main]
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
leaving main(0
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again

当main方法用完以后也就是主线线程死掉了以后,这个线程还是在运行中的。

-----------------------------------------------------------------------------------设定守护线程

 

而如果将线程设定为守护线程的话,情况就不一样的

 

package endual;

public class MainApp {

    /**
     * 标记为守护的线程将以全新的方式终止。守护线程用于后台的支持任务,而且仅仅在普通的,非守护线程
     * 仍然需要运行的时候才需要的。当VM检测仅仅剩下一个守护线程的时候,就会退出的。如果非守护线程仍然还
     * 存活着,VM就不会退出的,守护线程提供了一种管理某些后台处理的理想的方法,他们只是在支持其他非守护线程
     * 时才需要的
     * @param args
     */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("enter main()");
		Daemon de = new Daemon() ;
		de.setDaemon(true) ; //设置成为了daemon线程,设置成为守护线程
		de.start() ;
		
		try {
			Thread.sleep(3000) ;
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		System.out.println("leaving main(0");
	}

}

测试的结果是

 

 

enter main()
entering run()
in run() - currentThread()=Thread[Thread-0,5,main]
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
leaving main(0
in run()--  woke up again

 结果就是当main方法死掉以后,守护线程马上就死掉了的