Java-用户线程与守护线程

        在Java中,线程分为用户线程和守护线程。用户线程是程序的主要线程,而守护线程则是为用户线程提供支持的后台线程。以下是对这两种线程的详细解释以及示例代码。

用户线程与守护线程的区别

  1. 用户线程

    • 用户线程是应用程序中执行的主要线程,也叫做工作线程。
    • 当所有用户线程结束时,JVM会退出,即使还有守护线程在运行。
  2. 守护线程:

    • 守护线程是为其他线程提供服务的线程,通常在后台运行。
    • 当所有用户线程结束时,JVM会退出,守护线程也会随之终止。
    • 可以通过setDaemon(true)方法将线程设置为守护线程。
    • 例如Java的垃圾回收机制,就是一个经典的守护线程。

 

 示例1

public class ThreadExample {// 用户线程public static class UserThread extends Thread {@Overridepublic void run() {System.out.println("用户线程 " + this.getName() + " 开始执行");try {// 模拟工作Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("用户线程 " + this.getName() + " 执行结束");}}// 守护线程public static class DaemonThread extends Thread {@Overridepublic void run() {while (true) {System.out.println("守护线程 " + this.getName() + " 正在运行");try {// 模拟守护线程的工作Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {// 创建用户线程UserThread userThread = new UserThread();userThread.start();// 创建守护线程DaemonThread daemonThread = new DaemonThread();daemonThread.setDaemon(true); // 设置为守护线程daemonThread.start();// 主线程等待用户线程执行完毕try {userThread.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("主线程执行结束,JVM 将退出");}
}

代码解释

  1. 用户线程
    • UserThread类继承自Thread,重写run()方法。在run()方法中,模拟用户线程的工作,通过Thread.sleep(2000)使线程休眠2秒。
  2. 守护线程
    • DaemonThread类同样继承自Thread,重写run()方法。在该方法中,守护线程进入一个无限循环,每秒打印一次消息,模拟其后台服务的工作。
  3. 主方法
    • main方法中,首先启动用户线程和守护线程。然后,主线程调用userThread.join(),等待用户线程执行完毕后,主线程结束,JVM会退出。

示例2

public class DaemonThreadExample {public static void main(String[] args) {// 创建一个新线程Thread daemonThread = new Thread(() -> {while (true) {System.out.println("守护线程正在运行...");try {Thread.sleep(1000); // 暂停1秒} catch (InterruptedException e) {e.printStackTrace();}}});// 将线程设置为守护线程daemonThread.setDaemon(true);// 启动守护线程daemonThread.start();// 主线程休眠5秒try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}// 检查线程是否为守护线程System.out.println("daemonThread 是守护线程: " + daemonThread.isDaemon());}
}

代码解释

  1. 创建线程:使用 Thread 类创建一个新的线程,并定义其运行逻辑。
  2. 设置为守护线程:通过调用 setDaemon(true) 方法将该线程设置为守护线程。
  3. 启动线程:使用 start() 方法启动线程。
  4. 主线程休眠:为了让守护线程有足够的时间运行,主线程休眠5秒。
  5. 检查线程类型:使用 isDaemon() 方法检查线程是否为守护线程,并输出结果。

 

总结

        可以看出用户线程和守护线程的基本用法及其区别。用户线程负责执行主要任务,而守护线程则在后台提供支持服务。在实际应用中,合理使用这两种线程可以提高程序的效率和响应能力。

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

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

相关文章

HarmonyOS NEXT 应用运行异常记录与解决(持续整理版)

问题一 App Launch Failed to get the device apiVersion. 解决方案 进入到设备管理,点击对应开启的模拟器设备,先将模拟器关闭,然后点击查出掉用户数据,再重启。 重启之后,一般能解决。如果遇到还是显示拿不到apiVer…

《第三十四章 高级主题 - 动画效果》

在 Android 应用开发中,动画效果能够显著提升用户体验,使应用更加生动和吸引人。本章将深入探讨 Android 中的动画效果,包括属性动画、帧动画以及 ViewPager 动画。 一、属性动画 (一)属性动画简介 属性动画是 Android…

bash反弹shell分析

目录 介绍步骤 介绍 与目标主机建立连接的原理是利用漏洞执行ShellCode。 GetShell的实质是:执行ShellCode,将目标主机的Shell重定向到攻击机。拿到Shell利于后续的渗透。 所谓的反弹Shell是指GetShell的过程由目标主机主动发起(反向连接&a…

Git如何安装和配置

一、Git 的安装 1、Git 的官网 Git (git-scm.com) 2、下载 Git for Windows 在官网下载好 Git 的安装文件后,接下来就可以进行安装了。 3、安装 Git 以管理员身份运行你下载的安装文件: 然后就可以进入安装向导了。 4、验证是否安装成功 当安装向…

测试分类简介

1.按照测试⽬标分类 1)界面测试: 界⾯测试(简称UI测试),指按照界⾯的需求(⼀般是UI设计稿)和界⾯的设计规则,对我们软件界⾯所展⽰的全部内容进⾏测试和检查。 2)功能测试&#xff…

内存管理(三)--Linux CMA内存使用

文章目录 一、预留一段内存常用方法1.1 设备树定义reserve memory 二、内存节点常见属性2.1 no-map和reusable使用上的区别 三、预留CMA的reserved memory方法3.1 共享cma(采用设备树)3.2 共享cma(采用bootargs)3.3 私有cma 四、使…

【数据结构】--初始集合框架

1. 什么是集合框架 集合框架:Java中已经实现好的集合类(一些已经由Java实现好的数据结构)。Java的数据结构和C语言的数据结构是没有什么区别的,里面的区别就只是实现的语言不一样。不可能出现Java的单链表和C语言实现的单链表是两个不同的东…

idea配置svn发现安装的svn中的bin目录下没有svn.exe文件

问题描述 使用idea配置svn时,发现安装的svn没有svn.exe文件 解决方法 1、双击svn安装包,找到【modify】 2、默认安装时,没有安装command line client tools,里面是有svn.exe 3、选择will be installed on local hard drive 4、…

idea中使用git提交代码报错husky > pre-commit

1、原因: 本地项目中的.git下的一个文件导致的提交失败,这个文件是pre-commit文件。由于预提交钩子pre-commit导致的提交失败,通过删除.git/hooks/pre-commit文件可以解决 2、解决步骤: 1、找到项目中的.git文件夹,…

鸿蒙-右边固定长度,左边超长Text自适应

Component Entry struct test {build() {Row() {Column() {Text(长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串长字符串).maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis…

公园智能厕所引导大屏,清楚显示厕位有无人状态

在科技飞速发展的今天,公园的设施也在不断与时俱进。其中,公园智能厕所引导大屏的出现,为游客带来了全新的如厕体验。 走进公园的智能厕所区域,首先映入眼帘的便是那醒目的引导大屏。屏幕上清晰地显示着各个厕位的有无人状态&…

sqlite3的db.parallelize方法:并行执行SQL语句,提升数据库操作效率

在Node.js环境中,sqlite3作为一个广受欢迎的轻量级数据库库,为开发者提供了一个与SQLite数据库进行交互的简洁API。在进行数据库操作时,为了提高效率,sqlite3提供了db.parallelize方法,允许并行执行多个SQL语句&#x…

ROS Simulink 支持与限制

ROS Simulink 支持与限制 ROS 工具箱在 Simulink 中不支持以下 ROS 功能: ROS 服务 服务器ROS 动作 如果您的应用需要这些功能,建议使用 MATLAB ROS 功能。您可以使用 MATLAB 编写一个 ROS 节点,该节点可以将服务、动作和变换树发布到一个…

一、登录接口-注意实现

一、如何保护cookie或jwt不被劫持 使用https对请求、响应信息进行加密,防止被攻击者中途劫持请求信息 二、什么是跨域?合理的设置跨域能够解决哪些问题 跨域是浏览器做出的一种安全策略,它要求发起请求的客户端必须和服务端保持相同的协议…

4款电脑数据恢复软件分享,告别天价恢复!

大家应该都经历过数据丢失吧,这不,前两天,我那电脑不知怎的,突然就把我辛苦整理的文件夹给“咔嚓”一声删掉了。这下可好,我那里面可是有我好几个月的心血啊!好在,我之前也发生过类似的事情&…

【通俗理解】最优控制之旅——强化学习中的策略优化

【通俗理解】最优控制之旅——强化学习中的策略优化 关键词提炼 #最优控制 #强化学习 #状态值函数 #奖励函数 #折扣因子 #贝尔曼方程 #策略迭代 #值迭代 #动态规划 #马尔可夫决策过程 第一节:最优控制的类比与核心概念 1.1 最优控制的类比 最优控制就像是一位精…

视联动力数字科技新成果闪耀2024数博会

在2024年的8月28日至30日,贵阳举办的中国国际大数据产业博览会上,视联动力带来了一系列引人注目的技术和创新应用。 这场为期三天的展览会展示了公司在数字经济发展领域的最新成就,特别是国产通信协议技术方面的进展。 视联动力重点展出了算…

QGraphicsview相关学习

文章学习自: Qt_绘图框架_QGraphicsview实现缩放移动图片_Livy0123的博客-CSDN博客 这里进行一些自己的分析和理解。 (1) 自定义类MyGraphicsView继承自QGraphicsView 核心是重定义的滚轮事件。 [virtual protected] void QGraphicsView::wheelEvent(QWheelEve…

《python语言程序设计》第8章第11题将反向字符串 编写一个函数反向一个字符串,reverse(s)

def reverse(text_arrange):len_text len(text_arrange)dec_text ""for i in range(1, len_text 1):# print(i)dec_text text_arrange[-i]print(f"反向输出{dec_text}")reverse("12345678") reverse("abcdefg")

每日刷题(图论)

P1119 灾后重建 P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 看数据范围知道需要用到Floyd算法,但是道路是不能直接用的,需要等到连接道路的两个村庄重建好才可以使用,所以这需要按照时间依次加入中转点&#xff0c…