菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
197
0

守护线程

原创
05/13 14:22
阅读数 26552

博客博客,我来写博客,可能会有错误。奥利给!

守护线程Deamon,它有啥用。

在《java高并发编程详解》是这样说的:

守护线程是一类比较特殊的线程,一般用于处理一些后台工作,比如JDK的垃圾回收线程。在正常情况下,若JVM中没有一个非守护线程,则JVM的进程会退出。(看到这一句,心里what?***)

先了解一下线程的分类,有主线程、用户线程和守护线程(也不知道可不可以这样分,易于理解就行),Java程序入口就是由JVM启动main线程,main线程又可以启动其他线程。当所有线程都运行结束时,JVM退出,进程结束。如果有一个线程没有退出,JVM进程就不会退出。所以,必须保证所有线程都能及时结束。但是有一些线程它就是一直运行,像垃圾回收线程,如果JVM进程的垃圾回收线程是非守护线程,main线程完成工作,JVM无法退出,垃圾回收线程运行着,还在正常的工作,但是我们工作完成了,JVM要退出,所以这个时候守护线程闪亮登场。

守护线程具备自动结束生命周期的特性。在JVM中,所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出。因此,JVM退出时,不必关心守护线程是否已结束。

守护线程是指为其他线程服务的线程。常常用作于执行一些后台任务,有时也被称为后台线程。

下面一个简单的程序,来认识一下,守护线程。

public class DaemonThread {
    public static void main(String[] args) throws InterruptedException{
        //main线程开始
        Thread thread = new Thread(() ->
        {
          while(true)
          {
              System.out.println("my thread is running");
              try
              {
                  Thread.sleep(500);
              }catch (InterruptedException e)
              {
                  e.printStackTrace();
              }
          }
        });
        thread.setDaemon(true); //将thread设置为守护线程
        thread.start();//启动thread线程
        Thread.sleep(2000);
        System.out.println("Main thread finished lifecycle.");
    }
}

控制台结果:

 当我们没有把thread线程设置为守护线程,thread就会一直运行,没人结束它。当我们把thread.setDaemon(true)注释掉,控制台结果:

 

 

参考:《java高并发编程详解》https://www.liaoxuefeng.com/wiki/1252599548343744/1306580788183074
https://www.jianshu.com/p/6b68af3e5738

发表评论

0/200
197 点赞
0 评论
收藏
为你推荐 换一批