Java多线程——守护线程

守护线程

定义

在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。 所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

示例

使用匿名线程的方式创建一个线程,这个线程持续睡眠1ms,主线程睡眠1000ms输出,主线程main结束

public class TestDemo1 {
    public static void main(String[] args){
        Thread thread = new Thread(() -> {
            while (true){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.setDaemon(true);
        thread.start();

        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("main结束");
    }
}

特点

a.线程属性isDaemon的状态为true的。
b.当jvm应用中没有运行的用户线程时,守护线程会结束运行。
c.将线程变为守护线程,通过设置线程的方法 setDaemon(true)即可,但该方法必须在start()方法之前执行才可以,启动后的线程,不能中途改变线程类型
d.如果使用线程池框架ExecuteService,则守护线程会被改变成用户线程,线程的优先级也会被设置成普通线程的优先级。ExecuteService主要是用来管理线程的,不能创建线程。
e.守护线程具有传递性,当线程设置成守护线程了,那么它的子线程也是守护线程。
f.可以自动结束生命周期

使用

将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。

  • 注意:setDaemon方法只能线程启动之前使用,如果对于一个线程已经死亡或者未启动,那么设置setDaemon会抛出IllegalThreadStateException

JVM什么情况下退出?

  • The java virtual machine exits when the only thread running are all dameon thread.
  • 如果JVM没有一个守护线程,JVM进程不会退出
  • eg. 如果垃圾回收线程是一个非守护线程,那么某一程序完成工作运行结束,JVM无法退出,垃圾回收线程依旧工作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值