总结守护线程知识点
一、 概念
- 守护进程
守护进程类似于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();
}
}
}
}
三、注意事项
-
thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常,你不能把正在运行的常规线程设置为守护线程
-
在Daemon线程中产生的新线程也是Daemon的
-
ExecutorService执行守护线程会把守护线程转换为用户线程