码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 多线程中守护线程的使用


    java中线程分为非守护线程(用户线程)和守护线程(后台线程)

    一、setDaemon(boolean on)

    java线程中对于守护线程的使用主要是依靠setDaemon(boolean on)方法

    方法作用: 将此线程设置为守护线程

    守护线程使用上与普通线程没有区别, 但是在结束上有一点不同, 当一个进程中所有的普通线程都结束时, 进程就会结束, 此时所有正在运行的守护线程都会被强制杀掉(但是因为java虚拟机停止需要一定时间, 可能就不会出现立马将守护线程杀掉)

    注意事项:

    1. 设置守护线程的时候, 需要先设置守护现场, 再启动线程.否则会报错, 并且还是以普通线程来执行.

    2. 虚拟机必须确保用户线程执行完毕

    • 比如说我们的main主线程就是用户线程,当我们的 main() 执行完毕程序就结束了

    3. 虚拟机不用等待守护线程执行完毕

    • 比如说 gc() 垃圾回收线程就是守护线程,虚拟机不需要等待他执行完毕,我们不需要管他甚至都看不见他,虚拟机只要等待正常的用户线程执行结束了就会停止

    4. 守护线程的作用如:后台记录操作日志、监控内存、垃圾回收等等......

    二、代码演示

    1. package com.softeem.wolf.thread;
    2. import java.util.Calendar;
    3. import java.util.GregorianCalendar;
    4. /**
    5. * Created by 苍狼
    6. * Time on 2022-09-08
    7. */
    8. public class ThreadTest {
    9. public static void main(String[] args){
    10. Thread thread01 = new Thread("thread01"){
    11. @Override
    12. public void run() {
    13. for (int i = 0; i < 100; i++) {
    14. System.out.println(Thread.currentThread().getName()+"线程目前的执行时间是:"+new GregorianCalendar().get(Calendar.SECOND));
    15. if (i==10){
    16. try {
    17. Thread.currentThread().sleep(1000);
    18. } catch (InterruptedException e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. System.out.println("thread01是--->"+i);
    23. }
    24. }
    25. };
    26. Thread thread02 = new Thread("thread02"){
    27. @Override
    28. public void run() {
    29. for (int i = 0; i < 10; i++) {
    30. System.out.println(Thread.currentThread().getName()+"线程目前的执行时间是:"+new GregorianCalendar().get(Calendar.SECOND));
    31. if (i==5){
    32. try {
    33. Thread.currentThread().sleep(1000);
    34. } catch (InterruptedException e) {
    35. e.printStackTrace();
    36. }
    37. }
    38. System.out.println("thread02--->是"+i);
    39. }
    40. }
    41. };
    42. thread01.setDaemon(true);
    43. thread01.start();
    44. thread02.start();
    45. System.out.println("主线程执行完毕....");
    46. }
    47. }

    运行结果

    分析: 因为thread01线程被设置为守护线程, 所以当thread02线程执行完了之后, thread01按道理来说应该结束运行, 但是因为java虚拟机结束还是需要一段时间, 所以thread01线程又执行了一会就终止运行了(thread01线程并没有完全执行完), 程序就执行结束了, 

  • 相关阅读:
    [react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?
    知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - Java SpringBoot 操作 Neo4j
    【图像分割】基于matlab粒子群算法优化模拟退火算法图像分割【含Matlab源码 2020期】
    Java代码隐患之——Arrays.asList
    纯手码优质JAVA面试八股文
    博客整理 vim编译器
    Dynamic DataSource 多数据源配置【 Springboot + DataSource + MyBatis Plus + Druid】
    Spring Boot与Reactive MongoDB集成
    uniapp vue项目把图片路径从data数据传到css(uniapp css变量)
    C++之I/0流操作(标准流、文件流、二进制操作等)
  • 原文地址:https://blog.csdn.net/m0_50370837/article/details/126771599
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号