004 守护线程

一 . 概述

  守护线程是一种特殊的线程,其特殊性在于:

    [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的资源回收问题,我们不应该改依赖这个语法来完成.

posted @ 2018-05-05 18:43  最爱五仁月饼  阅读(80)  评论(0编辑  收藏  举报