守护线程
Posted lhh666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了守护线程相关的知识,希望对你有一定的参考价值。
博客博客,我来写博客,可能会有错误。奥利给!
守护线程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
以上是关于守护线程的主要内容,如果未能解决你的问题,请参考以下文章