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方法死掉以后,守护线程马上就死掉了的