首页 > 编程语言 >[Java并发]守护线程

[Java并发]守护线程

时间:2024-09-14 21:12:52浏览次数:9  
标签:正在 Java 并发 线程 守护 println import 运行

守护线程和普通线程的最大区别是守护线程会在主线程结束后退出,但是普通线程在主线程结束后不会退出。

普通线程的执行

import java.sql.Time;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("线程开始运行");
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try {
                        System.out.println("非守护线程正在运行");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }).start();
        System.out.println("主线程运行完成");
    }
}
线程开始运行
主线程运行完成
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行
非守护线程正在运行

守护线程的执行

import java.sql.Time;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("线程开始运行");
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try {
                        System.out.println("非守护线程正在运行");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        });
        thread.setDaemon(true);
        thread.start();
        System.out.println("主线程运行完成");
    }
}
线程开始运行
主线程运行完成
非守护线程正在运行

如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。

JVM 中的垃圾回收线程就是典型的守护线程,如果说不具备该特性,会发生什么呢?
当 JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬了!!!由此可见,守护线程的重要性了。

通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说 JVM 退出时,线程能够自动关闭,此时,守护线程是你的首选。

标签:正在,Java,并发,线程,守护,println,import,运行
From: https://www.cnblogs.com/DCFV/p/18414699

相关文章

  • java实际开发——涉及金额时使用的数据类型BigDecimal
    目录首先说结论,使用BigDecimal类。为什么不用其它的类型?(比如int、long、float、double)1、整型:2、浮点型:BigDecimal类基本数据类型与BigDecimal使用时的差别:1、创建2、+-*/3、比较标度(Scale)舍入模式首先说结论,使用BigDecimal类。为什么不用其它的类型?(比......
  • 构建高效稳定的并发处理系统:从理论到实战的全面优化指南
    目录引言引入问题背景:高并发场景下的线程管理挑战。说明本文的目标:探讨如何使用定时任务、线程池、消息队列、Redis等技术优化线程管理。高并发场景中的线程管理问题介绍高并发环境中的常见挑战。具体说明线程资源耗尽可能导致的问题。用通俗易懂的语言描述场景:例如,在......
  • 【JavaScript】LeetCode:707设计链表
    文章目录题目内容题目分析(1)获取第n个节点的值(2)头部插入节点(3)尾部插入节点(4)第n个节点前插入节点(5)删除第n个节点完整代码题目内容题目分析添加哨兵节点dummy。在第n个节点前插入节点时,应该找到第n-1个节点(即前一个节点),才能完成插入操作。在删除第n......
  • Python 课程8-多线程编程和多进程编程
    前言        在现代编程中,处理并发任务是提高程序性能的关键之一。Python提供了多线程(threading)和多进程(multiprocessing)两种方式来实现并发编程。多线程适用于I/O密集型任务,而多进程则更适合CPU密集型任务。通过这两种技术,你可以高效地处理大规模数据、加速......
  • 浅谈线程的创建方式
    引言在网上查询这个问题,大多回答是线程的创建方式有四种。继承Thread类实现Runnable接口实现Callable接口使用线程池但是这种说法是错误的,或者说是不正确的不严谨的。我的想法实际上,在Java中创建线程的方式只有一种,就是使用newThread()只有这样才能创建一个线......
  • Java8中日期类的使用
    LocalDate:日期类LocalTime:时间类LocalDateTime:日期时间类相关操作创建时间privatestaticvoiddateTimeAndFormat(){//当前日期时间LocalDatedate1=LocalDate.now();//指定日期时间LocalDatedate2=LocalDate.of(2025,6,6);......
  • 高级java每日一道面试题-2024年9月09日-数据库篇-事务提交后数据仍然没有持久化,可能的
    如果有遗漏,评论区告诉我进行补充面试官:事务提交后数据仍然没有持久化,可能的原因是什么?我回答:在Java高级面试中,讨论事务提交后数据仍然没有持久化的问题是一个很好的切入点,可以帮助考察候选人对事务管理、持久化机制以及潜在的编程和配置错误的理解。下面详细解释可能......
  • 高级java每日一道面试题-2024年9月08日-前端篇-JS的执行顺序是什么样的?
    如果有遗漏,评论区告诉我进行补充面试官:JS的执行顺序是什么样的?我回答:JavaScript的执行顺序是由其特殊的执行环境所决定的。JS的执行环境包括全局执行环境、函数执行环境和eval执行环境。在这些环境中,变量和函数声明会被提升(hoisting),而变量赋值和函数调用则按照......
  • java计算机毕业设计剧本杀桌游收银系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着桌游文化的兴起与剧本杀游戏的迅速普及,线下剧本杀体验馆成为年轻人休闲娱乐的新宠。这类场所不仅提供了独特的社交场景,还融合了角色扮演、逻辑推......
  • java计算机毕业设计教学质量测评系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今教育信息化的浪潮中,教学质量的提升已成为教育改革的核心议题。随着高校规模的不断扩大和学生数量的激增,传统的教学管理模式面临着效率低下、信......