Java并发编程—java中守护线程和用户线程

news2024/10/6 18:27:37

一、概念:

​ 守护线程:是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程

​ 用户线程:是系统的工作线程,它会完成这个程序需要完成的业务操作;我们使用 Thread类创建的线程在默认情况下都属于用户线程

二、如何判断是守护线程还是用户线程:

  • 通过 Thread.setDaemon(false) 设置为用户线程
  • 通过 Thread.setDaemon(true) 设置为守护线程
默认是用户线程

三、举个例子

​ 在很多面试地方,都会问一个问题,就是下面的代码启动创建了几个线程,分别是什么线程类型

public static void main(String[] args) {} 
这就是一个最简单的java中的项目入口,在这个过程中,是有2个线程:1个main主线程【用户线程】+GC守护线程;

这个例子对于有些小伙伴来说还是不太能理解,这里呢再举个有具体代码的例子

public static void main(String[] args) {
        //创建一个线程,内部类里面在对线程类型进行判断,然后有个循环
        Thread a = new Thread(() -> {
            System.out.println(Thread.currentThread().getName()+" 是: \t"
            +(Thread.currentThread().isDaemon()?"守护线程":"用户线程")
                    );
            while (true){

            }
        }, "a");
        //线程启动
        a.start();
        //主线程输出
        System.out.println(Thread.currentThread().getName()+"\t"+"主线程执行,我是"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
    }

效果图:
在这里插入图片描述

从图上可以看到,这个程序还在执行,然后控制台输出:a线程对象是一个用户线程,主函数main也是一个用户线程,当主函数main执行完毕后,a线程对象还在继续执行,因为里面有一个while循环,这个大家应该能理解;

那么,我将对a线程对象设置为守护对象,在25行之前加上下面的代码,看看是什么效果,:

 a.setDaemon(true);

运行效果:
在这里插入图片描述

大家现在可以看到,这个程序已经停止了,唯一改变的地方就是将a线程对象改成了守护线程类型,所以当main用户线程结束后,守护线程也会停止运行;

四、总结

1、当程序中所有用户线程执行完毕后,不管守护线程是否结束,系统(JVM)都会自动退出;
2、设置守护线程,需要在start()方法之前进行;
3、守护线程常用在心跳检测,事件监听,垃圾回收;
4、setDaemon() 方法必须在线程的 start() 方法之前调用,在后面调用会报异常,并且不起效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

求先序遍历序列中第(1<=k<=二叉树中结点个数)个结点的值

本题本质上就是一个遍历算法的实现,只不过用一个全局变量的来记录访问的序号,求其他遍历序列的第k个结点也采用相似的方法。二叉树的遍历算法可以引申出大量的算法题,因此考生务必熟练掌握二叉树的遍历算法。 C语言代码: //本题本…

mapbox地图动画一键飞行

最近,Mapbox GL JS 从 v2.9 开始支持将地图显示为 3D 地球。 话不多说,马上看看效果怎么样: mapbox地图动画我们通过设置投影属性projection:globe,即可将地图更改为地球 const map new mapboxgl.Map({container: m…

mybatis实战:二、mybatis xml 方式的基本用法

注释都在代码里,最好复制了再看! 1.创建表 CREATE TABLE sys_user( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 用户 ID, user_name VARCHAR(50) COMMENT 用户名, user_password VARCHAR(50) COMMENT 密码, user_email VARCHAR(50) COMMENT 邮箱, user…

manjaro 记录 1 安装流程

manjaro 记录 1 安装流程 初manjaro 记录 1 安装流程下载好镜像镜像写入U盘重启电脑,进入U盘安装进入界面:找到 launch installer 进行安装安装流程设置语言设置位置与时区设置键盘磁盘分区设置用户与管理员密码安装初 希望能写一些简单的教程和案例分享…

Flink JobManager 内存占用大 问题

Flink JobManager 内存占用大问题 问题描述 当在 本地启动一个 flink 简单的 job 时候,发现出现了 heap outMemeory 问题, 然后就不假思索的 调整了 jvm 的 heap -Xms1000m -Xmx16000m 参数,就可以正常的启动了。 通过 jvisualvm 连接上 这…

实验七 循环神经网络(3)LSTM的记忆能力实验

目录6.3 LSTM的记忆能力实验6.3.1 模型构建6.3.1.1 LSTM层6.3.1.2 模型汇总6.3.2 模型训练6.3.2.1 训练指定长度的数字预测模型6.3.2.2 多组训练6.3.2.3 损失曲线展示6.3.3 模型评价6.3.3.1 在测试集上进行模型评价6.3.3.2 模型在不同长度的数据集上的准确率变化图6.3.3.3 LSTM…

robfig/cron-go cron定时任务库架构剖析

Cron深度解析 思想 对于cron 这个三方库来说,他可以说是做两件事,其一是:解析cron string,生成一个定时器,达到循环时间发送信号。其二是核心(引擎):用以执行,判断&…

Spring基础篇:Spring简介

第一章:Spring简介 SpringIOC工厂是Spring所有特性的基础,Spring所有的特性都是基于IOC控制反转特性而来的。 当今微服务已经成为主流,微服务依赖于SpringBoot和SpringCloud,而SpringBoot和SpringCloud是衍生于Spring&#xff0c…

贺利坚汇编课程笔记2 访问寄存器和内存

贺利坚汇编课程笔记2 访问寄存器和内存 文章目录贺利坚汇编课程笔记2 访问寄存器和内存0201 寄存器及数据存储CPU的组成寄存器是CPU内部的信息存储单元通用寄存器--以AX为例“字”在寄存器中的存储0202 mov 和 add指令0203 确定物理地址的方法物理地址8086CPU给出物理地址的方法…

pytorch模型网页部署——Flask

一、Flask用法 Flask是python的轻量级web框架,可用来做简单的模型部署。Flask的基本用法如下: step1:定义Flask类的对象,即创建一个基于Flask的服务器 step2:定义公开的路由及路由对应的调用函数 step3&#xff1a…

分享新零售系统商城小程序开发制作功能介绍_商城小程序开发好处

小编主要专注于新零售系统开发商城的领域,新零售系统开发商业模式有哪些: ① 多种销售模式:邀请有奖、销售业绩奖、团队业绩奖、区域分红,分销模式等。 ② 团队协作功能:立即邀约分销模式,清楚搜索直属代…

大型ERP生产制造管理系统源码

🍓🍓【淘源码】:一个专业提供高品质源码免费下载的资源共享平台🍓🍓 👇👇👇以下是博主整理的淘源码网站内大家都比较感兴趣的一些源码,需要源码学习的朋友可以私信博主哦…

Exception | ShardingSphere | ShardingSphere引发的IndexOutOfBoundsException

ShardingSphere引发的IndexOutOfBoundsException一、异常二、 原因三、解决方法四、总结一、异常 ### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 ### The error may exist in file [D:\JetBrains\Idea\workspace\zohe\bjxz\ru…

N-gram和NNLM语言模型

背景: one-hot:缺点:1.高维稀疏,2.不能体现句子中词的重要性,3.不能体现词与词之间的关系。 embedding:1.解决了高维稀疏 tf-idf:2.解决了one-hot中不能体现句子中词的重要性这一特点。 语言模型:3.解决不能…

【20221201】【每日一题】划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 思路&…

协程Part1-boost.Coroutine.md

首先,在计算机科学中 routine 被定义为一系列的操作,多个 routine 的执行形成一个父子关系,并且子 routine 一定会在父 routine 结束前结束,也就是一个个的函数执行和嵌套执行形成了父子关系。 coroutine 也是广义上的 routine&a…

网页JS自动化脚本(五)修改文字元素的内容和大小

今天的网页打开全是灰色的,顺便缅怀一下伟人,那么我我们今天定位换成按钮文字 window.onloadfunction(){var theElementdocument.querySelector("input[typesubmit]");theElement.value"爱我中华";theElement.style"font-size:25px"; }这一次的…

提分必练!中创教育PMP全真模拟题分享来喽

湖南中创教育每日五题分享来啦,“日日行,不怕千万里;常常做,不怕千万事。”,每日五题我们练起来! 1、一个项目正在实行敏捷方法,在迭代过程中,团队成员互相合作,解决了一…

【机器学习】核函数

核方法 核技巧 非线性分类问题是指通过利用非线性模型才能很好地进行分类的问题。如图 111 所示,“●”表示正样本,“”表示负样本,显然无法用直线(线性模型)将正负样本正确分开,但是可以用一条椭圆曲线&…

记一次大事务优化历程(短信发送)

问题背景 短信服务数据库连接数告警,grafana查看数据库连接池被打满。 问题分析 在这段时间内,通过链路分析,发现最终调用第三方短信发送服务偶然耗时过长,分析了原有发送逻辑的代码,该实现在入口send处加了事务&am…