守护线程是什么?什么是Daemon线程?它有什么意义?

3 个回答

  • 小王子-B965
    做好自己,至于别人,分交情,看心情。
    ### 什么是Daemon线程? Daemon线程(后台线程或守护线程)是指在程序运行时在后台提供通用服务的线程,这些线程并不属于程序中不可或缺的一部分。当所有的非后台线程(用户线程)结束时,JVM也会终止Daemon线程并退出。 #### Daemon线程的意义 1. **提供后台服务**:Daemon线程通常用于执行一些后台任务,例如JVM的垃圾回收线程、Finalizer线程等。 2. **非关键性**:Daemon线程不是程序核心部分,当所有用户线程结束时,Daemon线程会自动终止。 #### 关键特性 - **与用户线程的关系**:只要有任何用户线程在运行,JVM就不会退出。一旦所有用户线程都结束运行,JVM将会终止所有Daemon线程并退出。 - **设置方法**:必须在启动线程之前调用`setDaemon(true)`方法,将线程设置为Daemon线程。 - **终止特性**:Daemon线程在JVM退出时不会执行`finally`块中的代码。 #### 示例代码 以下是一个示例,展示了如何创建和使用Daemon线程: ```java public class DaemonThreadExample { public static void main(String[] args) { Thread daemonThread = new Thread(() -> { try { while (true) { System.out.println("Daemon thread is running..."); Thread.sleep(1000); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Daemon thread interrupted."); } finally { System.out.println("Daemon thread finally block."); // 这行代码可能不会执行 } }); daemonThread.setDaemon(true); // 设置为Daemon线程 daemonThread.start(); try { Thread.sleep(3000); // 主线程休眠3秒后结束 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Main thread is ending..."); } } ``` 在这个示例中: - Daemon线程在后台运行并打印消息。 - 主线程在休眠3秒后结束。 - 一旦主线程结束,JVM会终止Daemon线程,Daemon线程的`finally`块可能不会执行。 #### 实际应用 - **垃圾回收**:JVM的垃圾回收线程就是一个典型的Daemon线程。 - **后台监控**:如日志监控、系统监控等,通常也可以使用Daemon线程来实现。 - **定期任务**:如缓存清理、资源回收等,也可以使用Daemon线程来执行。 ### 总结 Daemon线程在程序运行时提供后台服务,但它们并不是程序的关键部分。当所有用户线程结束时,JVM会自动终止所有Daemon线程。Daemon线程通常用于执行一些后台任务,如垃圾回收和系统监控等。必须在线程启动之前调用`setDaemon(true)`方法,将线程设置为Daemon线程。
    发布于 2023-03-06 02:49 •IP属地 香港
    举报
    评论
    收藏

  • 松林
    入体冰凉的月光,都比不上你绝情的目光。
    **守护线程**(即daemon thread),是个服务线程,准确地来说就是服务其他的线程,这是它的作用——而其他的线程只有一种,那就是用户线程。所以java里线程分2种, 1、守护线程,比如垃圾回收线程,就是最典型的守护线程。 2、用户线程,就是应用程序里的自定义线程。 **守护线程** 1、守护线程,专门用于服务其他的线程,如果其他的线程(即用户自定义线程)都执行完毕,连main线程也执行完毕,那么jvm就会退出(即停止运行)——此时,连jvm都停止运行了,守护线程当然也就停止执行了。 2、再换一种说法,如果有用户自定义线程存在的话,jvm就不会退出——此时,守护线程也不能退出,也就是它还要运行,干嘛呢,就是为了执行垃圾回收的任务啊。 3、守护线程又被称为“服务进程”“精灵线程”“后台线程”,是指在程序运行是在后台提供一种通用的线程,这种线程并不属于程序不可或缺的部分。 通俗点讲,任何一个守护线程都是整个JVM中所有非守护线程的“保姆”。 **用户自定义线程** 1、应用程序里的线程,一般都是用户自定义线程。 2、用户也可以在应用程序代码自定义守护线程,只需要调用Thread类的设置方法设置一下即可。 3、用户线程和守护线程几乎一样,唯一的不同之处就在于如果用户线程已经全部退出运行,只剩下守护线程存在了,JVM也就退出了。 因为当所有非守护线程结束时,没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了,程序也就终止了,同时会“杀死”所有守护线程。 也就是说,只要有任何非守护线程还在运行,程序就不会终止。 在Java语言中,守护线程一般具有较低的优先级,它并非只由JVM内部提供,用户在编写程序时也可以自己设置守护线程,例如将一个用户线程设置为守护线程的方法就是在调用start()方法启动线程之前调用对象的setDaemon(true)方法,若将以上括号里的参数设置为false,则表示的是用户进程模式。 需要注意的是,当在一个守护线程中产生了其它线程,那么这些新产生的线程默认还是守护线程,用户线程也是如此。
    发布于 2021-07-01 19:38 •IP属地 云南
    举报
    评论
    收藏

  • java小生
    见过花就好,何必在意花属于谁。
    守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。
    发布于 2021-07-01 19:32 •IP属地 安徽
    举报
    评论
    收藏