黑马程序员技术交流社区

标题: 守护线程 [打印本页]

作者: 史龙贤    时间: 2012-9-27 00:53
标题: 守护线程
今天看到一个守护线程,但是不太明白是神马意思?到底是什么守护法?是在什么情况下使用的?到底如何使用的?可以举个例子说明一下吗?
作者: 宫明星    时间: 2012-9-27 01:15
所谓的守护线程也叫后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。
因此当所有的非后台线程结束时,程序也就终止了,同时会杀死所有后台线程。
反过来说,只要有任何非后台线程(用户线程)还在运行,程序就不会终止。后台线程在不执行finally子句的情况下就会终止其run方法。
作者: 郭阳    时间: 2012-9-27 04:32
setDaemon方法必须在线程启动前调用,标记该线程为守护线程,当正在运行的线程都为守护线程时,也就是前台线程结束后,Java虚拟机退出。
也就是说守护线程有两种结束方式,一种是自己执行结束,一种是随着虽有的前台程序结束而结束。
应用最简单的就是jvm的垃圾回收机制,他是随着你的程序运行而运行,当你的程序结束,他也就结束。
作者: 王得新    时间: 2012-9-27 08:44
本帖最后由 王得新 于 2012-9-27 08:55 编辑

守护线程与普通线程的区别在于,在调用start()前,调用线程对象(这里的对象是t2)的方法setDaemon(true)。
当开始守护线程的主线程退出时,守护线程自动退出。有很多的运用,比如JVM的垃圾回收、内存管理等线程都是主线程的守护线程。

从结果可以看出  "守护线程第" + i + "次执行!"  并没有执行50次(这时因为   “当开始守护线程的主线程退出时,守护线程自动退出”)。

public class ThreadDemo{

    /**
     * @param args
     */
    public static void main(String[] args) {
        Thread t1 = new CommonThread();
        Thread t2 = new Thread(new DaemonThread());
        t2.setDaemon(true); //设置为守护线程

        t2.start();
        t1.start();
    }

}
................................................................................................
public class CommonThread extends Thread {
    public void run() {
      
        for (int i = 0; i < 10; i++) {
            System.out.println("普通线程1第" + i + "次执行!");
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
...................................................................................................
public class DaemonThread implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println("守护线程第" + i + "次执行!");
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2