文章目录

  • 官方文档
  • Daemon Thread VS User Thread
  • Daemon thread的特点
  • 方法
    • void setDaemon(boolean status)
    • boolean isDaemon()
  • Exceptions in Daemon thread
  • 例子
  • 使用场景分析

官方文档

我们以JAVA8的doc为例 戳这里


Daemon Thread VS User Thread

Java提供两种类型的线程:用户线程和守护程序线程。

  • 用户线程是高优先级线程。 JVM将在终止任务之前等待任何用户线程完成其任务。
  • 守护程序线程是低优先级线程, 其唯一作用是为用户线程提供服务

由于守护程序线程旨在为用户线程提供服务,并且仅在用户线程运行时才需要,因此一旦所有用户线程完成执行,它们都不会阻止JVM退出。

这也就是为什么通常存在于守护程序线程中的无限循环不会导致问题,因为任何代码(包括finally块)都不会在所有用户线程完成执行后执行。因此,不建议将守护程序线程用于I / O任务。

但是,这条规则有例外。守护程序线程中设计糟糕的代码可能会阻止JVM退出。例如,在正在运行的守护程序线程上调用Thread.join()可以阻止应用程序的关闭。


Daemon thread的特点

  • 当所有用户线程完成执行时,它们无法阻止JVM退出。

  • 当所有用户线程完成执行时,JVM会自行终止

  • 如果JVM发现正在运行的守护程序线程,它将终止该线程并在该关闭后自行终。 JVM不关心守护程序线程是否正在运行。

  • 这是一个极低优先级的线程。


方法

void setDaemon(boolean status)

public final void setDaemon(boolean on)
parameters:
on : if true, marks this thread as a daemon thread.
exceptions:
IllegalThreadStateException: if only this thread is active.
SecurityException: if the current thread cannot modify this thread.

此方法用于将当前线程标记为守护程序线程或用户线程。

举个例子:

如果有一个用户线程tU,那么tU.setDaemon(true)会使它成为守护程序线程

如果有一个守护程序线程tD,那么通过调用tD.setDaemon(false)会使它成为用户线程。


boolean isDaemon()

public final boolean isDaemon()
returns:
This method returns true if this thread is a daemon thread;
false otherwise

此方法用于检查当前是守护进程。 如果线程是守护进程,则返回true,否则返回false。


Exceptions in Daemon thread

如果在启动线程后调用setDaemon()方法,则会抛出IllegalThreadStateException。

package com.artisan.test;public class DaemonThread extends Thread {public void run(){System.out.println("Thread name: " + Thread.currentThread().getName());System.out.println("Check if its DaemonThread: "+ Thread.currentThread().isDaemon());}public static void main(String[] args){DaemonThread t1 = new DaemonThread();DaemonThread t2 = new DaemonThread();t1.start();// Exception as the thread is already startedt1.setDaemon(true);t2.start();}
}


例子

package com.artisan.test;import java.time.LocalDateTime;public class DaemonThread extends Thread {public DaemonThread(String name) {super(name);}@Overridepublic void run() {// Checking whether the thread is Daemon or notif (Thread.currentThread().isDaemon()) {try {System.out.println(getName() + " is Daemon thread : running " + LocalDateTime.now());// 休眠200sThread.sleep(200_000);System.out.println(getName() + " is Daemon thread: over " + LocalDateTime.now());} catch (InterruptedException e) {e.printStackTrace();}} else {try {System.out.println(getName() + " is User thread : running " + LocalDateTime.now());// 休眠5sThread.sleep(5_000);System.out.println(getName() + " is User thread : over " + LocalDateTime.now());} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {System.out.println(Thread.currentThread().getName() + ": running " + LocalDateTime.now());DaemonThread t1 = new DaemonThread("t1");DaemonThread t2 = new DaemonThread("t2");DaemonThread t3 = new DaemonThread("t3");// Setting user thread t1 to Daemont1.setDaemon(true);// starting first 2 threadst1.start();t2.start();// Setting user thread t3 to Daemont3.setDaemon(true);t3.start();System.out.println(Thread.currentThread().getName() + ": over " + LocalDateTime.now());}
}

执行结果:

  1. setDaemon(true) 设置为Daemon Thread
  2. JVM将在终止任务之前等待任何用户线程完成其任务,JVM不关心守护程序线程是否正在运行,当用户线程结束后将退出。 从日志中我们可以看到t2是个user thread ,休眠了5秒,t3是daemon thread 休眠200秒,但是我们看到t2 用户线程执行完成后,jvm就退出了,虽然t3 daemon thread 还在进行中,这个时候t3已经被终止了。

使用场景分析

心跳检测

A ----------------------------------------------------------------------------- B
–>Daemon Thread(Health Check)

举个例子: 当A到B建立了一个长连接 ,长连接是需要发心跳的,维持这个连接。 这个时候可以在中开启一个Daemon Thread用于心跳检测,当A死掉的时候,这个Daemon Thread 也会被JVM终止掉,就避免了A和B之间已经断开,但是心跳检测可能报错了但一直不退出的情况的发生。

高并发编程-Daemon Thread的创建以及使用场景分析相关推荐

  1. 高并发编程-Thread_正确关闭线程的三种方式

    文章目录 概述 stop() Deprecated 方式一 设置开关 方式二 调用interrupt API 方式三 暴力结束线程-> Daemon Thread + interrupt API ...

  2. java线程高并发编程

    java线程详解及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了,看看百度百科对他的评价,一点也不为过: 如果IT的历史,是 ...

  3. Java并发编程:Thread类的使用

    为什么80%的码农都做不了架构师?>>>    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学 ...

  4. 高并发编程-自定义简易的线程池(2),体会原理

    文章目录 概述 示例 概述 高并发编程-自定义简易的线程池(1),体会原理 中只实现了任务队列,我们这里把其余的几个也补充进来 拒绝策略 关闭线程池 最小 最大 活动线程数 - 示例 比较简单,直接上 ...

  5. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  6. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  8. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  9. 高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

最新文章

  1. 无线路由安全功能的保证之DHCP
  2. ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测)
  3. 每天学一点儿shell:linux常用快捷键
  4. boost::describe模块实现console的测试程序
  5. sharing分片集合环境搭建【MongDB系列之七】
  6. SAP Spartacus UI Duplicated keys has been found in the config of i18n chunks
  7. 计算机软考初级工程资料,计算机软考网络工程师复习资料及习题(一)
  8. python爬虫入门必备正则_python 爬虫入门之正则表达式 一
  9. 怕数学的家长注意了:怎样做好孩子理科思维的启蒙?
  10. Sharding-JDBC简介_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记006
  11. 怎么把文件导入云服务器,怎么把文件放到云服务器里
  12. C程序设计语言现代方法02:C语言基本概念
  13. linux系统交换空间,Linux中如何使用和管理交换空间
  14. Android打开系统文件管理器
  15. 怎么用计算机打出音乐符号,音乐符号怎么打(教你word文档音乐符号怎么打)...
  16. 智能家居有线系统与无线系统,该怎么选?
  17. 微信扫码登陆 无需开放平台实现方案
  18. linux格式化叫大硬盘命令,Linux_format命令 参数说明,格式化 格式化指定卷中的磁盘 - phpStudy...
  19. python读取excel表格数据
  20. matlab-colormap-contourf函数

热门文章

  1. linux mysql libc.so_mysql-arm-linux-gcc编译报错:libc.soformatnotrecognized.
  2. 价格走势PHP源码,php多币种区块链交易所源码 存取功能齐全+最新价格走势正常...
  3. sql 2020 0528
  4. 登录 googlecloud,链接数据库
  5. 经典的cnn model
  6. docker 从harbor 拉取镜像慢_Kubernetes-通过Rancher从Harbor私有仓库拉取镜像
  7. tensorflow 就该这么学--2
  8. 对比学习系列论文CPCforHAR(一):Contrastive Predictive Coding for Human Activity Recognition
  9. 文巾解题 326. 3的幂
  10. Tableau必知必会之图表显示部分标签的小妙招