返回顶部
首页 > 资讯 > 后端开发 > Python >Java中的守护线程问题
  • 886
分享到

Java中的守护线程问题

Java线程守护线程Java守护线程 2022-11-13 19:11:40 886人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录守护线程在Java中有两类线程守护线程与用户线程的区别1 定义和概述2 使用守护线程3 测试案例4 注意事项守护线程 在Java中有两类线程 User Thread(用户线程)D

守护线程

在Java中有两类线程

  • User Thread(用户线程)
  • Daemon Thread(守护线程)

守护线程的功能非常简单,在其本身是一个线程的同时,主要是为了给其他的线程提供服务,比如说计时器,清空高速缓存等等操作,守护线程具有和被守护线程一样的生命周期(这里并不是说守护线程和被守护线程常常是1-1的关系),当被守护线程死亡,守护线程往往也会死亡,当虚拟机中只剩下守护线程时,虚拟机就会退出,因为此时也没有运行程序的必要了

一个比较通俗的解释:任何一个守护线程都是整个JVM中所有非守护线程的保姆

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

守护线程的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。

需要注意的点是:

  • 守护线程的优先级比较低
  • 守护线程要注意考虑关机动作
  • 守护线程应该永远不去访问固有资源,比如说文件或者数据库,因为它会在任何时候甚至一个操作的中间发生中断。

不要给守护线程分担读写逻辑或者计算逻辑,因为无法确定守护线程是否已经完成了工作,但是只要User退出守护线程也会立马结束,对于计算机程序来说这样的程序可能多次运行结果不一样,很显然这对于程序来说是毁灭性的。

操作:

通过thread.setDaemon(true) 将线程转换为守护线程

这个方法必须在thread.start()之前进行调用

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

介绍Java守护线程与用户线程的概念和使用方法,以及相关注意事项。

1 定义和概述

Java 中的线程分为两类,分别为daemon 线程(守护线程〉和user 线程(用户线程)。守护线程又称Daemon线程,运行在后台,看不见;用户线程运行在前台,看的见。

在JVM启动时会调用main 函数, main 函数所在的线程就是一个用户线程,其实在JVM内部同时-还启动了好多守护线程, 比如垃圾回收线程。

Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持性工作。这意味着,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的退出。

实际上,在main线程运行结束后,JVM会自动启动一个叫作DestroyJavaVM 的线程,该线程会等待所有用户线程结束后终止JVM 进程。

TomcatNIO实现NioEndpoint中会开启一组接受线程来接受用户的连接请求,以及一组处理线程负责具体处理用户请求,在默认情况下,接受线程和处理线程都是守护线程,这意味着当tomcat 收到shutdown 命令后并且没有其他用户线程存在的情况下tomcat 进程会马上消亡,而不会等待处理线程处理完当前的请求。

2 使用守护线程

在线程start之前,可以通过调用thread.setDaemon(true)将线程设置为Daemon线程。

守护线程有两种结束方式:

  • 守护线程也具有自己的run();方法,当后台线程完成自己的run方法后,守护线程结束。
  • 用户线程运行结束,守护线程自动结束。

3 测试案例

public class Daemon {
//启动该类,将会构造两条线程,main线程和一条子线程。
    public static void main(String[] args) throws InterruptedException {
        //测试非守护线程
        //可以看到,输出"main线程结束"之后,子线程还在继续输出,程序没有结束
//        test1();
        //测试守护线程
        //可以看到,输出"main线程结束"之后,子线程没有继续输出,程序结束
        test2();
    }

    
    public static void test1() throws InterruptedException {
        Thread thread = new Thread(() -> {
            while (true) {
                try {
                    Thread.currentThread().sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程非守护线程");
            }
        });
        thread.start();
        Thread.currentThread().sleep(1000);
        System.out.println("main线程结束");
    }

    //测试守护线程
    public static void test2() throws InterruptedException {
        Thread thread = new Thread(() -> {
            while (true) {
                try {
                    Thread.currentThread().sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程守护线程");
            }
        });
        thread.setDaemon(true);
        thread.start();
        Thread.currentThread().sleep(1000);
        System.out.println("main线程结束");
    }
}

使用jps查看java进程,可以发现如果子线程是守护线程那么主线程结束,子线程也结束了;如果子线程不是守护线程那么主线程结束,子线程没有结束。

4 注意事项

Daemon线程被用作完成支持性工作,但是在Java虚拟机退出时Daemon线程中的finally块并不一定会执行,如下代码:

public class Daemon {
    public static void main(String[] args) {
        Thread thread = new Thread(new DaemonRunner(), "DaemonRunner");
        thread.setDaemon(true);
        thread.start();
    }

    static class DaemonRunner implements Runnable {
        @Override
        public void run() {
            try {
                SleepUtils.second(10);
            } finally {
                System.out.println("DaemonThread finally run.");
            }
        }
    }
}

运行Daemon程序,可以看到在控制台上没有任何输出。main线程(非Daemon线程)在启动了线程DaemonRunner之后随着main方法执行完毕而终止,而此时Java虚拟机中已经没有非Daemon线程,虚拟机需要退出。Java虚拟机中的所有Daemon线程都需要立即终止,因此DaemonRunner立即终止,但是DaemonRunner中的finally块并没有执行。

在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源的逻辑。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java中的守护线程问题

本文链接: https://lsjlt.com/news/171133.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中的守护线程问题
    目录守护线程在Java中有两类线程守护线程与用户线程的区别1 定义和概述2 使用守护线程3 测试案例4 注意事项守护线程 在Java中有两类线程 User Thread(用户线程)D...
    99+
    2022-11-13
    Java线程 守护线程 Java守护线程
  • java中守护线程与非守护线程的区别有什么
    这篇文章将为大家详细讲解有关java中守护线程与非守护线程的区别有什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:pub...
    99+
    2023-05-31
    java 守护线程 非守护线程
  • 如何守护Java项目中的线程
    如何守护Java项目中的线程?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。       守护线程并非虚拟机内部可以提供,...
    99+
    2023-05-31
    java 线程守护 ava
  • java中设置线程为守护线程的方法
    这篇文章主要介绍java中设置线程为守护线程的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以...
    99+
    2023-06-14
  • 在java中创建守护线程的方法
    本篇文章为大家展示了在java中创建守护线程的方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调...
    99+
    2023-05-31
    java 守护线程 ava
  • Java守护线程和用户线程的区别
    目录守护线程定义创建守护线程将线程池设置为守护线程守护线程 VS 用户线程用户线程守护线程守护线程注意事项总结前言: 在 Java 语言中,线程分为两类:用户线程和守护线程,默认情况...
    99+
    2024-04-02
  • 怎么在java中使用守护线程
    这期内容当中小编将会给大家带来有关怎么在java中使用守护线程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面...
    99+
    2023-06-14
  • Java中守护线程介绍及使用
    目录一、什么是守护线程二、为什么需要守护线程三、如何使用注意:总结一、什么是守护线程 在说守护线程之前,我们先说一下什么是用户线程。 用户线程:我们平常创建的普通线程。守护线程(即 ...
    99+
    2024-04-02
  • java怎么设置守护线程
    在Java中,可以通过`Thread.setDaemon(true)`方法将线程设置为守护线程。守护线程是一种特殊的线程,当所有非守...
    99+
    2023-08-20
    java
  • java守护线程怎么应用
    Java守护线程是指在后台提供一种通用服务的线程,并且在所有非守护线程结束时自动退出。守护线程通常用于执行一些背景任务,如垃圾回收、...
    99+
    2023-10-27
    java
  • Java中用户线程与守护线程的使用区别
    目录1.默认用户线程2.主动修改为守护线程2.1 设置线程为守护线程2.2 设置线程池为守护线程3.守护线程 VS 用户线程3.1 用户线程3.2 守护线程3.3 小结4.守护线程注...
    99+
    2024-04-02
  • Java语言多线程终止中的守护线程实例
    Java中线程分为两种类型:用户线程和守护(服务)线程。通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程;不设置则默认为用户线程。结束单线程用 Thread.i...
    99+
    2023-05-30
  • Java并发中守护线程的示例分析
    今天就跟大家聊聊有关Java并发中守护线程的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemo...
    99+
    2023-06-17
  • Java项目中实现守护线程的方法
    Java项目中实现守护线程的方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线...
    99+
    2023-05-31
    java 守护线程 ava
  • Java中用户线程与守护线程如何使用
    本篇内容介绍了“Java中用户线程与守护线程如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.默认用户线程Java 语言中无论是线程...
    99+
    2023-06-30
  • Java中守护线程和用户线程的区别有哪些
    这篇文章主要介绍Java中守护线程和用户线程的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MV...
    99+
    2023-06-14
  • Java中用户线程和守护线程有什么区别
    这篇文章给大家分享的是有关Java中用户线程和守护线程有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在 Java  语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知,所以本文...
    99+
    2023-06-15
  • python浅析守护线程与非守护线程的区别与使用
    目录什么是守护线程非守护线程守护线程什么是守护线程 当主线程执行结束后,所有 在运行的子线程都 直接结束,不管子任务是否完成很多语言的 垃圾收集器 就运用了 守护线程,去回收程序不再...
    99+
    2024-04-02
  • java中守护线程的注意事项有哪些
    小编给大家分享一下java中守护线程的注意事项有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java基本数据类型有哪些Java的基本数据类型分为:1、整数类...
    99+
    2023-06-14
  • python中什么是守护线程
    这篇文章将为大家详细讲解有关python中什么是守护线程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作