Thread之守护线程

本文深入探讨Java中守护线程(DaemonThread)与用户线程(UserThread)的区别,包括它们的作用、创建方式以及在Java虚拟机中的行为。特别关注守护线程的限制和应用场景,如垃圾回收线程和web服务器中的调度线程。

守护线程

  java有两种Thread: 守护线程“DaemonThread”  与  用户线程“UserThread”;

  守护线程是一种“在后台提供通用性支持”的线程,让并不属于程序本体;

  任何线程都可以是DaemonThread或者UserThread,他们唯一的区别就是判断虚拟机何时离开;

  用户线程和守护线程的区别:    

    用户线程:java虚拟机在它所非守护线程已经离开后自动离开;

    守护线程:守护线程是用来服务用户线程的,如果没有其他用户线程在运行,就没有服务对象了,就会消亡结束;

  守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:public final void setDaemon(boolean on) ;但是有几点需要

  守护线程限制注意

  1)thread.setDaemon(true);必须在thread.start();之前设置,否则会跑出异常:IllegalThreadStateExpection(非法线程状态异常)

  1)限制就是潜藏告诉信息:你不能把正在运行的常规线程设置为守护线程。以为set要放在启动之前,启动后的就不能设置了   (这点与守护进程有着明显的区别,守护进程是创建后,让进程摆脱原会话的控制+让进程摆脱原进程组的控制+让进程摆脱原控制终端的控制;所以说寄托于虚拟机的语言机制跟系统级语言有着本质上面的区别)

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

  2)当你在守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程也同理

  (这一点又是有着本质的区别了:守护进程fork()出来的子进程不再是守护进程,尽管它把父进程的进程相关信息复制过去了,但是子进程的父进程不是init进程,所谓的守护进程本质上说就是“父进程挂掉,init收养,然后文件0,1,2都是/dev/null,当前目录到/”)

  3)不是所有的应用都可以分配给Daemon线程来进行服务比如说IO读写操作或者计算逻辑(因为很可能在DaemonThread还没来得及进行操作时,虚拟机可能已经退出了)

  守护线程的应用:

  例:我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

  daemon Thread实际应用在那里呢?举个例子,web服务器中的Servlet,容器启动时后台初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。

 

转载于:https://www.cnblogs.com/lm2-1/p/8480828.html

守护线程(Daemon Thread)是计算机编程中的一个重要概念,特别是在多线程编程中,通常用于执行某些在程序运行期间需要持续运行的后台任务。该概念最初在Java语言中引入,后被广泛应用于其他编程语言[^1]。 ### 特点 守护线程与主线程(或其他非守护线程)的生命周期不同,当所有的非守护线程结束时,守护线程也会随之结束。守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。JVM中的垃圾回收线程就是典型的守护线程,当非守护线程都结束后,守护线程也会自动关闭[^3][^5]。 ### 使用场景 - **后台任务处理**:守护线程通常用于执行一些后台任务,这些任务对于整个程序的运行并不是必需的,而且在程序的主要逻辑结束时可以被安全地终止。例如,日志记录、性能统计、定时任务等可以作为守护线程来执行[^5]。 - **服务监控和管理**:守护线程常常被用来监控和管理其他线程或资源,确保它们的正常运行。例如,在服务器应用中,可以使用守护线程来监控网络连接、数据库连接等资源,及时释放无用资源或重新尝试连接[^5]。 - **辅助性工作**:一些辅助性的工作可以交给守护线程来完成,比如周期性的数据清理、定时任务的执行等[^5]。 - **资源回收**:守护线程通常用于执行垃圾回收(Garbage Collection)工作,确保程序的内存得到及时的回收和释放,以避免内存泄漏问题[^5]。 ### 实现方法 以下分别给出Java和Python中实现守护线程的示例代码: #### Java实现守护线程 ```java class MyDaemonThread extends Thread { public void run() { while (true) { System.out.println("Daemon thread is running..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class DaemonThreadExample { public static void main(String[] args) { MyDaemonThread daemonThread = new MyDaemonThread(); // 设置为守护线程 daemonThread.setDaemon(true); daemonThread.start(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Main thread is exiting."); } } ``` #### Python实现守护线程 ```python import threading import time def daemon_task(): while True: print("Daemon thread is running...") time.sleep(1) daemon_thread = threading.Thread(target=daemon_task) # 设置为守护线程 daemon_thread.daemon = True daemon_thread.start() time.sleep(3) print("Main thread is exiting.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值