一 . 概述
守护线程是一种特殊的线程,其特殊性在于:
[1]依赖于其他非守护线程,一旦整个程序中没有了其他类型的线程运行,那么守护线程自动终结.
[2]运行的优先级别低,可以作一些系统级别的辅助行为.
二 .创建一个守护线程.
其实创建一个守护线程和一般的线程没有什么区别,只是在线程启动之前需要设置该线程为守护线程.
例子:
Thread thread = new Thread() { @Override public void run() { for(;;) System.out.println(" I am is a daemon Thread ..."); } }; thread.setDaemon(true); thread.start(); Thread.sleep(3000); System.out.println("end ....");
创建一个守护线程只需要注意设置一个守护的属性就可以了.
三. finally失效
public class DaemonTest { private static class DaemonThread extends Thread{ public DaemonThread() { this.setDaemon(true); } @Override public void run() { try { for(;;) { System.out.println("thread is running....."); } }finally { System.out.println("执行finally语句"); } } } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { /** * 1.Daemon线程的父线程现在就是主线程,当主线终结的时候,daemon线程就终结掉了. * 2.在finally的语句未必会执行,daemon线程的特性优先级比finally的级别要高. */ new DaemonThread().start(); TimeUnit.SECONDS.sleep(1); } }
运行上面的例子,我们发现daemon线程无法使用finally语句完成终结,因此对于一个daemon的资源回收问题,我们不应该改依赖这个语法来完成.