守护线程就是标记为守护(daemon)的线程,也就是简单的调用下setDaemon()方法。
Thread t = new Thread(); t.setDaemon(true);//标记为守护线程
守护线程用于后台支持任务,典型的用例是垃圾回收或者监视资源动态。守护线程将以全新的方式终止,它并不是想普通线程那样执行完自己的任务之后消亡,而是当JVM检测剩下的线程只有守护线程时也就是说普通线程已经消亡的情况下JVM就会推出,守护线程也就消亡了。守护线程提供了一种管理某些后台处理的理想方法,它们只是在支持其他非守护线程时才需要。
我依然用代码说明一切,下面看代码
public class DaemonThread implements Runnable{ public void run(){ System.out.println("entering run()"); try{ System.out.println("in run() - currentThread() = " + Thread.currentThread()); while(true){ try{ Thread.sleep(500); }catch(InterruptedException x){ } System.out.println("in run() - woke up again"); } }finally{ System.out.println("leaving run()"); } } }
public class DaemonThreadMain { public static void main(String[] args){ System.out.println("entering main"); Thread t = new Thread(new DaemonThread()); t.setDaemon(true);//设置守护线程 t.start(); //让main()线程睡眠一段时间,好让t线程可以运行 try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("leaving main()"); } }
运行结果:
entering main //JVM创建main线程 entering run() //main线程睡眠,t线程进入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 in run() - woke up again leaving main() //主线程睡醒,主线程结束, //JVM忽略守护程然后退出
代码中被标记为守护线程的run方法里面是一个死循环,如果此线程是普通线程,则JVM将始终不会退出,因为有线程在运行,而上述代码中把此线程标记为守护线程,根据守护线程的定义可以退出JVM在当程序中非守护线程(本例中也就是main线程)运行结束之后,自动结束守护线程,退出JVM。
本文出自 “混混” 博客,请务必保留此出处http://yimaoqian.blog.51cto.com/1328422/1396343