守护线程和用户线程
上一篇:线程死锁
守护线程和用户线程
概述:
Java中的线程分为两类【daemon】守护线程和【user】用户线程;在JVM启动时会调用main函数,main函数所在的线程就是一个用户线程,其实在JVM内部还同时启动了很多守护线程,比如垃圾回收线程。
区别:
当最后一个用户线程结束时JVM正常退出,不论是否有守护线程在执行,即程序是否退出和是否存在未运行结束的守护线程无关;而当用户线程没有执行完JVM则不会退出;换句话说JVM是否退出只与用户线程有关
代码示例:
package com.dwk.thread;
/**
* @author duweikun
* @describe 守护线程
* @date 2021/10/15
*/
public class DaemonThreadTest {
/**
* 创建一个守护线程
* @return
*/
public Thread creatOneDaemonThread(){
Thread daemonThread = new Thread(()->{
System.out.println("守护线程");
//让守护线程死循环
while (true){}
});
//设置线程为守护线程
daemonThread.setDaemon(true);
return daemonThread;
}
/**
* 测试守护线程和用户线程
*/
public void test() throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println("用户线程");
});
Thread daemonThread = this.creatOneDaemonThread();
daemonThread.start();
thread.start();
}
public static void main(String[] args) throws InterruptedException {
DaemonThreadTest daemonThreadTest = new DaemonThreadTest();
daemonThreadTest.test();
System.out.println("程序结束");
}
}
执行结果:
可以看到先输出了程序结束,这是因为JVM启动的时候调用main函数,main是一个主线程,main里面创建的是它的子线程,而线程之间要是没有共用对象的话是不会互相影响的,,从这个地方也可以说明,父线程的结束不会影响子线程的运行;
程序中设置守护线程进入死循环,按道理一个线程没有执行完程序是不会结束的,但是在用户线程结束之后,程序运行结束了,说明程序的退出与否只与用户线程有关。
总结:当前进程中不存在用户线程,但是存在执行中的守护线程,JVM不等待守护线程结束就会终止JVM进程;然后在使用的时候,如果想要mian函数结束就终止程序的话可以将用户线程都设置成守护线程;
ps:其实书上还介绍了为什么main函数结束后会等待其他用户线程执行结束后才终止JVM进程,这里就不详细介绍了,简单点说就是JVM启动时调用main函数的同时开启了一个DestroyJavaVm的线程,这个线程会等待所有的用户线程结束后终止JVM进程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南