Java 守护线程
创始人
2024-03-13 12:35:39
0

✨✨hello,愿意点进来的小伙伴们,你们好呐!
🐻🐻系列专栏:【JavaEE初阶】
🐲🐲本篇内容:详解守护线程
🐯🐯作者简介:一名现大二的三非编程小白,日复一日,仍需努力。

  • Daemon 线程 介绍:
  • Daemon 线程的 构造:
  • 演示 Daemon 线程 :
  • Daemon 线程 注意事项:

Daemon 线程 介绍:

Daemon 线程 就是 我们经常听说到的 守护线程
🚗🚗🚗
该Daemon 线程 是一个支持型的线程 , 可以理解为Daemon 线程 支持了Java程序进程的后台调度, 只要在 程序中只存在Daemon 线程 执行,那么该程序就会退出程序,并销毁进程

🚓🚓🚓
相反的是当一个程序存在非Daemon 线程 时,那么这个程序就会等待非Daemon 线程 执行结束后再销毁进程

Daemon 线程的 构造:

🚕🚕🚕
Daemon 线程 是我们在创建线程的时候设置的,只有在启动线程之前设置,无法在启动线程后设置

Daemon 线程 是通过 setDaemon(true) 方法来设置的

在这里插入图片描述

演示 Daemon 线程 :

🚙🚙🚙
接下来我们来看看守护线程与非守护线程的区别

先来看看非守护线程:

public class ThreadDemo26 {public static void main(String[] args) {Thread thread = new Thread(() -> {for (int i = 0; i < 100; i++) {System.out.println("设置守护线程");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}, "Daemon");
/*        thread.setDaemon(true);*/thread.start();}
}

🚌🚌🚌
我们没有使用设置 Daemon 线程的方法,这个时候线程的运行就会发现,输出正常输出,且使用 jconsole 工具也可以看得到进程与线程正在执行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
那这个时候除了我们创建的线程外为什么还有那么多线程呢?

其实这些线程都是JVM自带的线程,当一个进程创建的时候,就会有这些线程的创建,随着进程的执行结束,这些线程就随着销毁,由此可见,这些由JVM自带的线程都是 Daemon线程,不会影响进程的结束

在这里插入图片描述

🚐🚐🚐
接下来我们来`设置Daemon线程来观察一下会发生哪些变化

public class ThreadDemo26 {public static void main(String[] args) {Thread thread = new Thread(() -> {for (int i = 0; i < 100; i++) {System.out.println("设置守护线程");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}, "Daemon");thread.setDaemon(true);thread.start();}}

我们会发现,运行程序后,好像就程序直接结束了,然后在 jconsole 工具也找不到进程了
其实这个时候,在main线程中调用了Daemon线程,然后main线程结束后,Daemon线程又是守护线程,那么这个时候Daemon线程不会阻止进程的结束执行,所以进程就结束了,相对着,Daemon线程也是销毁的

🚎🚎🚎
Daemon线程随之main线程的执行完毕而终止
在这里插入图片描述
在这里插入图片描述

Daemon 线程 注意事项:

🚒🚒🚒
构建 Daemon线程还需要注意一点:
不能依靠finally块来做释放资源的操作;

public class ThreadDemo26 {public static void main(String[] args) {Thread thread = new Thread(() -> {for (int i = 0; i < 100; i++) {System.out.println("设置守护线程");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}finally {System.out.println("Daemon线程执行 finally");}}}, "Daemon");thread.setDaemon(true);thread.start();}}

执行结果我们可以看到,程序并不会执行到finally块中的内容,所以我们在这里要慎重使用
在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...