用户线程&&守护线程
守护线程是为用户线程服务的,当一个程序中的所有用户线程都执行完成之后程序就会结束运行,程序结束运行时不会管守护线程是否正在运行,由此我们可以看出守护线程在 Java 体系中权重是比较低的。当一个程序中的所有用户线程都结束之后,无论守护线程是否在工作都会跟随用户线程一起结束。守护线程从业务逻辑层面来看权重比较低,但对于线程调度器来说无论是守护线程还是用户线程,在优先级相同的情况下被执行的概率都是相同的。守护线程的经典使用场景是垃圾回收线程,守护线程中创建的线程默认情况下也都是守护线程。
(一)想要查看线程是否为守护线程只需通过调用 isDaemon()
方法查询即可,如果查询的值为 false
则表示不为守护线程,自然也就属于用户线程了。
(二)果是线程,则可以通过设置 setDaemon(true)
方法将用户线程直接修改为守护线程,而如果是线程池则需要通过 ThreadFactory
将线程池中的每个线程都为守护线程才行。
//创建固定个数的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(10, new ThreadFactory() {
- 守护线程的设置
setDaemon(true)
必须要放在线程的start()
之前,否则程序会报错。 - 在守护线程中创建的所有子线程都是守护线程。
- 使用
jojn()
方法会等待一个线程执行完,无论此线程是用户线程还是守护线程。 - 即使是守护线程,当程序中调用
join()
方法时,程序依然会等待守护线程执行完成之后再结束进程。
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战