快速了解Java多线程——Daemon线程(守护线程)

一、什么是Daemon线程

Daemon线程也是守护线程,它是一种支持型的线程,主要用在程序的后台调度以及一些支持性(服务性)的工作,常见的例子:JVM中垃圾回收线程就是典型的守护线程

二、守护线程和用户线程的区别

守护线程与用户线程的区别发生在JVM的离开:

  • 可以说JVM想要运行,用户线程也必须运行
  • 守护线程是服务于用户线程的,如果用户线程不在了,那么守护线程的存在是没有意义的,此时该程序(进程)就没有运行的必要了,JVM也就退出了
  • 守护线程的优先级是低于用户线程的

三、用户设置守护线程

守护线程并不是固定死的,用户也可以将自己的线程(服务性质)设置为守护线程,设置方法为Thread.setDaemon()方法,我们看看源码:

public final void setDaemon(boolean on) {
        checkAccess();
        if (isAlive()) {
            throw new IllegalThreadStateException();
        }
        // daemon属性默认为false
        daemon = on;
    }

我们可以通过setDaemon(true)来设置当前线程为守护线程,但是需要注意的是,该方法必须在线程启动前的执行,即执行在线程NEW状态之后,RUNNABLE之前的,因为源码中的**isAlive()**会检测当前线程是否是活跃状态,即启动或正常执行状态,如果isAlive()为true,则抛出异常

 Thread daemonTread = new Thread();
 
 daemonThread.setDaemon(true);
 
 // 返回 true 则为守护线程
 daemonThread.isDaemon();
  • 在Daemon中产生的新线程也是守护线程
  • 前面说到了,服务性质的线程可以设置为守护线程,类似于读写操作、计算逻辑。
    • 如果带有这些操作的线程被设置为守护线程,在它执行时,有用户线程在执行的话还好说,但是可能会出现该线程创建完成且启动但是还没有执行到读写操作,尤其是写操作,可能是作为某个程序的最后一步执行,那么此时该程序中的用户线程都已经执行完毕了,而main函数只负责创建守护线程并启动,然后,main线程也会关闭,JVM发现没有用户线程了,便会退出,守护线程也会终止,此时可能还来不及进行写操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值