• 多线程中守护线程的使用


    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线程并没有完全执行完), 程序就执行结束了, 

  • 相关阅读:
    学习笔记6——垃圾回收
    从物联网到万物互联:AI与6G融合,实现互联智能
    ubuntu22.04 耳机没声音 [已解决]
    Oracle19c安装图文教程
    Modern Radar for Automotive Applications(用于汽车应用的现代雷达)
    三步减少打包机故障
    指针数组变量指向IO口变量,方便循环操作
    【23-24 秋学期】NNDL 作业3
    python控制Windows桌面程序自动化模块uiautomation
    工程制图平面投影练习
  • 原文地址:https://blog.csdn.net/m0_50370837/article/details/126771599