• Java 守护线程的作用 Java 守护线程线程


    Java 守护线程的作用 Java 守护线程线程

    一、概述

            在看java线程相关的内容时,有一个 daemon thread 守护线程的概念,看方法注释内容,大意是:将此线程标记为守护线程用户线程。当运行的所有线程都是守护线程时,Java虚拟机将退出

    1. Marks this thread as either a daemon thread or a user thread.
    2. The Java Virtual Machine exits when the only threads running are all daemon threads.

     

     

    二、守护线程理解

            1、有这么一段代码:

    1. public static void main(String[] args) {
    2. Thread mainThread = Thread.currentThread();
    3. System.out.println(mainThread.getName() +" mainThread daemon :" + mainThread.isDaemon());
    4. Thread thread = new Thread(() -> {
    5. int res = new Random().nextInt(1000);
    6. try {
    7. Thread.sleep(res);
    8. } catch (InterruptedException e) {
    9. e.printStackTrace();
    10. }
    11. System.out.println(Thread.currentThread().getName() + "==》》res=" + res);
    12. });
    13. thread.setDaemon(true);
    14. thread.start();
    15. System.out.println("daemon : " + thread.isDaemon());
    16. System.out.println(Thread.currentThread().getName() + "==》程序执行完毕!");
    17. }

            2、 thread.setDaemon(true); 时,结果如下 (异步线程没有执行):

    1. main mainThread daemon :false
    2. daemon : true
    3. main==》程序执行完毕!

            3、thread.setDaemon(false); 时,结果如下(异步线程有结果):

    1. main mainThread daemon :false
    2. daemon : false
    3. main==》程序执行完毕!
    4. Thread-0==》》res=102

            4、结论:当前 thread.setDaemon(true); 时,通过控制台的输出,我们可以看到 当线程被设置为守护线程后,此时程序中没有正在执行的 非守护线程,程序就会执行结束 --- 异步线程比 main线程晚2秒执行,此时 main线程已经执行完毕。

    三、总结

            1、java中线程默认都是非守护线程,即 daemon = false ,可以通过 thread.setDaemon(true); 设置为守护线程。

            2、thread.setDaemon(true) 必须在 thread.start() 之前设置,否则会抛出 IllegalThreadStateException 异常。

            3、在使用 junit 单元测试时,会出现: 无论线程是否为 守护线程,异步线程都不会执行 --- 不确定啥问题, 估计是 junit 单元测试的问题 。

            4、比如下面这段代码:子线程内容不会执行的!

    1. @Test
    2. public void daemonNotest() throws Exception{
    3. Thread unitTestThread = Thread.currentThread();
    4. System.out.println(unitTestThread.getName() +" unitTestThread daemon :" + unitTestThread.isDaemon());
    5. Thread thread = new Thread(() -> {
    6. int res = new Random().nextInt(1000);
    7. try {
    8. Thread.sleep(1000L);
    9. } catch (InterruptedException e) {
    10. e.printStackTrace();
    11. }
    12. System.out.println(Thread.currentThread().getName() + "==》》res=" + res);
    13. });
    14. System.out.println("daemon : " + thread.isDaemon());
    15. thread.start();
    16. System.out.println(Thread.currentThread().getName() + "==》程序执行完毕!");
    17. }

            5、多线程相关的测试,请 使用 main 方法,比较好!经验之谈,不确定 Junit 是啥原因导致不执行!

  • 相关阅读:
    开发者的第一台服务器 ECS云服务器低至99元:新老同享
    Socket发送缓冲区接收缓冲区快问快答
    使用Vue-cli构建spa项目及结构解析
    MyBatis-Plus概念和简单的案例
    [NOIP2001 提高组] 一元三次方程求解
    【ML on Kubernetes】第 10 章:构建、部署和监控模型
    Java常用工具环境安装手册(持续更新)
    一个有关sizeof的题目
    QT在安装后添加新组件【QT基础入门 环境搭建】
    武汉新时标文化传媒有限公司解读抖音平台的算法与推荐机制
  • 原文地址:https://blog.csdn.net/HaHa_Sir/article/details/126923357