总结守护线程知识点

一、 概念

  • 守护进程

守护进程类似于windows服务,linux上如果想实现守护进程,可以通过nohup命令来实现

nohup java -Dspring.profiles.active=dev -jar xxx.jar » app.log 2>&1 &

  • 守护线程

守护线程的作用是服务于用户线程,例如JVM中的GC线程

如果所有的用户线程都已经结束,那JVM实例也会结束,同时所有的守护线程也一起被结束掉

只要JVM实例中有一个用户线程在执行,那守护线程就会继续执行直到完成

java语言可以通过Thread实例的setDaemon(true)来将一个线程设置为守护线程

二、示例

示例代码

import java.util.concurrent.TimeUnit;

public class Test3 {
    public static void main(String[] args)
    {
        Thread mainThread = new Thread(() -> {
            Thread childThread = new Thread(new ClildThread());
            //设置子线程为守护线程,主线程退出自后子线程自动退出,因为进程里面没有其它用户线程在执行了
            //否则子线程会一直无线循环执行下去不会退出
            childThread.setDaemon(true);
            childThread.start();
            System.out.println("I'm main thread...");
        });
        mainThread.start();
    }
}

class ClildThread implements Runnable
{
    @Override
    public void run()
    {
        //子线程无限循环
        while(true)
        {
            System.out.println("I'm child thread..");
            try
            {
                TimeUnit.MILLISECONDS.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
}

三、注意事项

  1. thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常,你不能把正在运行的常规线程设置为守护线程

  2. 在Daemon线程中产生的新线程也是Daemon的

  3. ExecutorService执行守护线程会把守护线程转换为用户线程

参考

Java 守护线程概述

Linux 守护进程的启动方法