Java线程之守护线程(Daemon)用法实例

 更新时间:2015年07月20日 12:06:04   作者:鉴客  
这篇文章主要介绍了Java线程之守护线程(Daemon)用法,较为详细的分析了守护线程的功能与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Java线程之守护线程(Daemon)用法。分享给大家供大家参考。具体如下:

守护线程(Daemon)
Java有两种Thread:“守护线程Daemon”与“用户线程User”。
我们之前看到的例子都是用户,守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。
从字面上我们很容易将守护线程理解成是由虚拟机(virtual machine)在内部创建的,而用户线程则是自己所创建的。事实并不是这样,任何线程都可以是“守护线程Daemon”或“用户线程User”。他们在几乎每个方面都是相同的,唯一的区别是判断虚拟机何时离开:
用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。setDaemon(boolean on)方法必须在线程启动之前调用,当线程正在运行时调用会产生异常。isDaemon方法将测试该线程是否为守护线程。值得一提的是,当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。

例:我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

import java.io.IOException;
/**
 * 守护线程在没有用户线程可服务时自动离开
 */
public class TestMain4 extends Thread {
  public TestMain4() {
  }
  /**
   * 线程的run方法,它将和其他线程同时运行
   */
  public void run() {
    for(int i = 1; i <= 100; i++){
      try {
        Thread.sleep(100);
      } catch (InterruptedException ex) {
        ex.printStackTrace();
      }
      System.out.println(i);
    }
  }
  public static void main(String [] args){
    TestMain4 test = new TestMain4();
    test.setDaemon(true);
    test.start();
    System.out.println("isDaemon = " + test.isDaemon());
    try {
      System.in.read();
      // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}

希望本文所述对大家的java程序设计有所帮助。

相关文章

  • java生成验证码工具类

    java生成验证码工具类

    这篇文章主要为大家详细介绍了java生成验证码工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java中的final关键字使用方式

    Java中的final关键字使用方式

    这篇文章主要介绍了Java中的final关键字使用方式,final 关键字用于修饰不可改变内容,更多相关梳理总结,需要的小伙伴可以参考下面文章内容
    2022-06-06
  • Spring配置数据源的三种方式(小结)

    Spring配置数据源的三种方式(小结)

    本文主要介绍了Spring配置数据源的三种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 一文搞懂MyBatis多数据源Starter实现

    一文搞懂MyBatis多数据源Starter实现

    本文将实现一个MyBatis的Springboot的Starter包,引用这个Starter包后,仅需要提供少量配置信息,就能够完成MyBatis多数据源的初始化和使用,需要的小伙伴可以参考一下
    2023-04-04
  • java字符串反转示例分享

    java字符串反转示例分享

    这篇文章主要介绍了将一个字符串进行反转或者字符串中指定部分进行反转的方法,大家参考使用吧
    2014-01-01
  • SpringFactoriesLoader类作用详解

    SpringFactoriesLoader类作用详解

    SpringFactoriesLoader可以加载jar包下META-INF下的spring.factories,把相关接口的实现按照key,value的形式加载到内存,一个接口的多个实现可以按照","进行分割
    2022-10-10
  • Java 将Word转为HTML的方法

    Java 将Word转为HTML的方法

    本文介绍如何在JAVA程序中将Word文档通过Document.saveToFile()方法转换为HTML文档,导入jar的两种方法,文中给大家详细介绍,感兴趣的朋友一起看看吧
    2021-10-10
  • 一文带你了解如何正确使用MyBatisPlus

    一文带你了解如何正确使用MyBatisPlus

    在本篇文章中,我们奖通过 MyBatis Plus 来对一张表进行 CRUD 操作,来看看是如何简化我们开发的。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • Springboot如何加载静态图片

    Springboot如何加载静态图片

    这篇文章主要介绍了Springboot如何加载静态图片,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • JVM加载class文件的原理机制实例详解

    JVM加载class文件的原理机制实例详解

    Java是一种具有动态性的解释型语言,类(class)只有被加载到JVM后才能运行,接下来通过本文给大家介绍JVM加载class文件的原理机制详解,感兴趣的朋友一起看看吧
    2022-04-04

最新评论