什么是守护线程?

好记性不如赖笔头…………

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。
User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

注意:

(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2) 在Daemon线程中产生的新线程也是Daemon的。
(3) 不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑。

API说明如下:

void setDaemon(boolean on) 标志着该线程是 守护线程或用户线程。  

例子:

实体类:
package com.Ckinghan.threadEach;

public class Daemon extends Thread {

    @Override
    public void run() {
        for(int i = 0; i < 500; i++){
            System.out.println(this.getName()+"第"+(i+1)+"次执行");
        }
    }
}


测试类

package com.Ckinghan.threadEach;

public class DaemonDemo {

    public static void main(String[] args) {
        Daemon  d1 = new Daemon();
        Daemon  d2 = new Daemon();

        /**
         * 将两个线程设置为守护线程
         */
        d1.setDaemon(true);
        d2.setDaemon(true);

        d1.start();
        d2.start();

        for(int i = 0; i < 10; i ++){
            System.out.println(Thread.currentThread().getName()+"主线程正在执行:"+i);
        }

    }

}


执行结果:

main主线程正在执行:0
Thread-11次执行
Thread-01次执行
Thread-12次执行
main主线程正在执行:1
Thread-13次执行
Thread-02次执行
Thread-03次执行
Thread-04次执行
Thread-05次执行
Thread-06次执行
Thread-07次执行
Thread-08次执行
Thread-09次执行
Thread-010次执行
Thread-011次执行
Thread-012次执行
Thread-013次执行
Thread-014次执行
Thread-015次执行
Thread-016次执行
Thread-017次执行
Thread-018次执行
Thread-019次执行
Thread-14次执行
main主线程正在执行:2
Thread-15次执行
Thread-020次执行
Thread-16次执行
main主线程正在执行:3
main主线程正在执行:4
main主线程正在执行:5
Thread-17次执行
Thread-021次执行
Thread-18次执行
main主线程正在执行:6
Thread-19次执行
Thread-022次执行
Thread-110次执行
main主线程正在执行:7
Thread-111次执行
Thread-023次执行
Thread-112次执行
main主线程正在执行:8
Thread-113次执行
Thread-024次执行
Thread-114次执行
main主线程正在执行:9
Thread-115次执行
Thread-116次执行
Thread-117次执行
Thread-118次执行
Thread-119次执行
Thread-120次执行
Thread-121次执行
Thread-122次执行
Thread-123次执行
Thread-124次执行
Thread-125次执行
Thread-126次执行
Thread-127次执行
Thread-128次执行
Thread-129次执行
Thread-130次执行
Thread-131次执行
Thread-132次执行


从上面的结果可以看出,当用户的线程结束之后,两个守护线程也随之结果,正常情况下,线程d1/d2每个都要循环输出500次,但它成了守护线程后,会随着用户线程的退出而终止。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值