iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么理解java高并发的用户线程和守护线程
  • 454
分享到

怎么理解java高并发的用户线程和守护线程

2023-06-25 11:06:45 454人浏览 八月长安
摘要

这篇文章主要讲解了“怎么理解java高并发的用户线程和守护线程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解java高并发的用户线程和守护线程”吧!守护线程是一种特殊的线程,在后台默

这篇文章主要讲解了“怎么理解java高并发的用户线程和守护线程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解java高并发的用户线程和守护线程”吧!

守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程都是守护线程。与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作。如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以当系统只剩下守护进程的时候,java虚拟机会自动退出。

java线程分为用户线程和守护线程,线程的daemon属性为true表示是守护线程,false表示是用户线程。

下面我们来看一下守护线程的一些特性。

程序只有守护线程时,系统会自动退出

package com.itsoku.chat03;public class Demo1 {    public static class T1 extends Thread {        public T1(String name) {            super(name);        }        @Override        public void run() {            System.out.println(this.getName() + "开始执行," + (this.isDaemon() ? "我是守护线程" : "我是用户线程"));            while (true) ;        }    }    public static void main(String[] args) {        T1 t1 = new T1("子线程1");        t1.start();        System.out.println("主线程结束");    }}

运行上面代码,结果如下:

怎么理解java高并发的用户线程和守护线程

可以看到主线程已经结束了,但是程序无法退出,原因:子线程1是用户线程,内部有个死循环,一直处于运行状态,无法结束。

再看下面的代码:

package com.itsoku.chat03;public class Demo2 {    public static class T1 extends Thread {        public T1(String name) {            super(name);        }        @Override        public void run() {            System.out.println(this.getName() + "开始执行," + (this.isDaemon() ? "我是守护线程" : "我是用户线程"));            while (true) ;        }    }    public static void main(String[] args) {        T1 t1 = new T1("子线程1");        t1.setDaemon(true);        t1.start();        System.out.println("主线程结束");    }}

运行结果:

怎么理解java高并发的用户线程和守护线程

程序可以正常结束了,代码中通过 t1.setDaemon(true); 将t1线程设置为守护线程,main方法所在的主线程执行完毕之后,程序就退出了。

结论:当程序中所有的用户线程执行完毕之后,不管守护线程是否结束,系统都会自动退出。

设置守护线程,需要在start()方法之前进行

package com.itsoku.chat03;import java.util.concurrent.TimeUnit;public class Demo3 {    public static void main(String[] args) {        Thread t1 = new Thread() {            @Override            public void run() {                try {                    TimeUnit.SECONDS.sleep(10);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        };        t1.start();        t1.setDaemon(true);    }}

t1.setDaemon(true);是在t1的start()方法之后执行的,执行会报异常,运行结果如下:

怎么理解java高并发的用户线程和守护线程

线程daemon的默认值

我们看一下创建线程源码,位于Thread类的init()方法中:

Thread parent = currentThread();this.daemon = parent.isDaemon();

dameon的默认值为为父线程的daemon,也就是说,父线程如果为用户线程,子线程默认也是用户现场,父线程如果是守护线程,子线程默认也是守护线程。

示例代码:

package com.itsoku.chat03;import java.util.concurrent.TimeUnit;public class Demo4 {    public static class T1 extends Thread {        public T1(String name) {            super(name);        }        @Override        public void run() {            System.out.println(this.getName() + ".daemon:" + this.isDaemon());        }    }    public static void main(String[] args) throws InterruptedException {        System.out.println(Thread.currentThread().getName() + ".daemon:" + Thread.currentThread().isDaemon());        T1 t1 = new T1("t1");        t1.start();        Thread t2 = new Thread() {            @Override            public void run() {                System.out.println(this.getName() + ".daemon:" + this.isDaemon());                T1 t3 = new T1("t3");                t3.start();            }        };        t2.setName("t2");        t2.setDaemon(true);        t2.start();        TimeUnit.SECONDS.sleep(2);    }}

运行代码,输出:

main.daemon:false
t1.daemon:false
t2.daemon:true
t3.daemon:true

t1是由主线程(main方法所在的线程)创建的,main线程是t1的父线程,所以t1.daemon为false,说明t1是用户线程。

t2线程调用了 setDaemon(true);将其设为守护线程,t3是由t2创建的,所以t3默认线程类型和t2一样,t2.daemon为true。

感谢各位的阅读,以上就是“怎么理解java高并发的用户线程和守护线程”的内容了,经过本文的学习后,相信大家对怎么理解java高并发的用户线程和守护线程这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么理解java高并发的用户线程和守护线程

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么理解java高并发的用户线程和守护线程
    这篇文章主要讲解了“怎么理解java高并发的用户线程和守护线程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解java高并发的用户线程和守护线程”吧!守护线程是一种特殊的线程,在后台默...
    99+
    2023-06-25
  • java高并发的用户线程和守护线程详解
    目录程序只有守护线程时,系统会自动退出设置守护线程,需要在start()方法之前进行线程daemon的默认值总结守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回...
    99+
    2024-04-02
  • Java守护线程和用户线程的区别
    目录守护线程定义创建守护线程将线程池设置为守护线程守护线程 VS 用户线程用户线程守护线程守护线程注意事项总结前言: 在 Java 语言中,线程分为两类:用户线程和守护线程,默认情况...
    99+
    2024-04-02
  • Java中用户线程和守护线程有什么区别
    这篇文章给大家分享的是有关Java中用户线程和守护线程有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在 Java  语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知,所以本文...
    99+
    2023-06-15
  • Java中守护线程和用户线程的区别有哪些
    这篇文章主要介绍Java中守护线程和用户线程的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MV...
    99+
    2023-06-14
  • Java中用户线程与守护线程如何使用
    本篇内容介绍了“Java中用户线程与守护线程如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.默认用户线程Java 语言中无论是线程...
    99+
    2023-06-30
  • Java中用户线程与守护线程的使用区别
    目录1.默认用户线程2.主动修改为守护线程2.1 设置线程为守护线程2.2 设置线程池为守护线程3.守护线程 VS 用户线程3.1 用户线程3.2 守护线程3.3 小结4.守护线程注...
    99+
    2024-04-02
  • java守护线程怎么应用
    Java守护线程是指在后台提供一种通用服务的线程,并且在所有非守护线程结束时自动退出。守护线程通常用于执行一些背景任务,如垃圾回收、...
    99+
    2023-10-27
    java
  • Java并发中守护线程的示例分析
    今天就跟大家聊聊有关Java并发中守护线程的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemo...
    99+
    2023-06-17
  • java高并发之理解进程和线程
    目录进程线程进程与线程的一个简单解释总结进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指...
    99+
    2024-04-02
  • java中守护线程与非守护线程的区别有什么
    这篇文章将为大家详细讲解有关java中守护线程与非守护线程的区别有什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:pub...
    99+
    2023-05-31
    java 守护线程 非守护线程
  • java高并发中怎样理解进程和线程
    java高并发中怎样理解进程和线程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调...
    99+
    2023-06-25
  • java怎么设置守护线程
    在Java中,可以通过`Thread.setDaemon(true)`方法将线程设置为守护线程。守护线程是一种特殊的线程,当所有非守...
    99+
    2023-08-20
    java
  • 怎么在java中使用守护线程
    这期内容当中小编将会给大家带来有关怎么在java中使用守护线程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面...
    99+
    2023-06-14
  • java多线程守护线程的实现方法是什么
    本篇内容介绍了“java多线程守护线程的实现方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!lass StopThread...
    99+
    2023-06-04
  • java的多线程高并发详解
    目录1.JMM数据原子操作2.来看volatile关键字3.并发编程三大特性4.双锁判断机制创建单例模式5.synchronized关键字6.AtomicIntger原子操作7.锁优...
    99+
    2024-04-02
  • java高并发之线程组详解
    目录线程组创建线程关联线程组为线程组指定父线程组根线程组批量停止线程总结线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树...
    99+
    2024-04-02
  • python守护线程的作用是什么
    Python中的守护线程是一种特殊类型的线程,其作用是在主线程结束时自动退出,而不需要显式地调用线程的退出方法。守护线程通常用于执行...
    99+
    2023-10-23
    python
  • Java语言守护线程DaemonThread使用示例详解
    目录守护线程用户线程设为守护线程守护线程 在Java语言中有两类线程:用户线程和守护线程。我们通俗的讲,任意一个守护线程都是整个JVM中所有线程的"大管家";只要...
    99+
    2022-11-13
    Java 守护线程Daemon Thread Java 守护线程
  • 理解Java多线程之并发编程
    目录1 多线程的使用场景2 多线程的缺点2.1 上下文切换的开销(1)上下文切换的开销(2)如何减少上下文切换2.2 多线程中的数据一致性问题(1)线程中访问外部数据的过程(2)线程...
    99+
    2023-02-02
    Java并发编程 java并发编程实战 java并发编程的艺术
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作