news 2026/3/2 5:53:40

[Java 并发编程] Thread 类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Java 并发编程] Thread 类

Thread 类

1. Interrupt

​ 在 Java 中,我们不能随意地中断一个线程,因为我们不清楚这个线程的运行状态,它可能持有锁,如果强行中断它可能会导致锁不能被释放的问题。或者可能正在操作数据库,强行中断可能出现数据不一致的情况。因此,Interrupt方法实际上是为目标线程设置一个中断状态,而不是真的中断其运行,目标线程的具体退出时机由其自己决定。

​ 如果目标线程处于运行状态,则不会受任何影响,只是状态被标记为中断,目标线程需调用isInterrupted()来监听这个状态,从而响应中断信号。

​ 如果目标线程处于阻塞状态(wait()join()sleep()),肯定就不能监听中断标记了,那么如何告知目标线程被中断呢,Java 在这里的处理方法是使这些可被中断的阻塞方法抛出InterruptedException,当然也会将其标记为中断。例如:

publicclassTransactionManager{// 该方法会尝试提交事务,如果提交失败(抛出 CommitException)会进行重试,最多重试 MAX_RETRIES 次。// 每次重试间隔 1 秒。如果在等待期间被中断则抛出 InterruptedException。publicbooleancommitWithRetry()throwsInterruptedException{for(inti=0;i<MAX_RETRIES;i++){try{returndoCommit();}catch(CommitExceptione){if(i==MAX_RETRIES-1)throwe;Thread.sleep(1000);}}returnfalse;}}// 调用方:try{transactionManager.commitWithRetry();}catch(InterruptedExceptione){transactionManager.rollback();// 执行回滚Thread.currentThread().interrupt();// 重新设置中断状态throwe;// 继续向上传递}

​ 这里的关键是,必须将中断信号一直传递下去(捕获InterruptedException会清除中断标记),也就是让上层代码能够感知线程的中断。这个信号的传递方式,可以是上抛异常,也可以是重新设置中断状态,也可以是抛出自定义的业务异常,这主要看上层代码是怎样响应中断信号的,但出于防御性编程的思想我们要尽量多做一些事情,这意味着:

​ 如果在当前层无需做任何处理,直接上抛,此时中断状态未清除。

​ 如果在当前层需要 catch 然后进行收尾处理,那么建议无论如何要调用interrupt()重新设置中断状态,并抛出自定义的业务异常,这样可以保证上层代码对中断的感知,无论其选择监听中断信号还是捕获异常。

2. Join

​ Join 指线程的合并,调用join()的语句可以理解为合并点,合并线程需要在合并点等待,一直等到被合并线程执行完成或等待超时。

3. Daemon

​ Java 中的线程分为两类,守护线程和用户线程,守护线程也称为后台线程,使用setDaemon(false)设置一个线程为守护线程。

​ 守护线程和用户线程的本质区别是:它们对 JVM 进程终止的影响不同。用户线程会主动影响 JVM 进程的终止,如果全部用户线程执行完毕,JVM 进程随之终止,无论当前存不存在守护线程,因此守护线程受 JVM 进程终止的被动影响。

​ 由于守护线程的终止具有不确定性,所以在守护线程中我们要尽量避免访问系统资源。否则如果守护线程被强行终止,可能会引发系统资源操作的中断,导致资源损坏。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/1 13:08:56

LINQ 新时代:CountBy、AggregateBy 深度解析(含对比 GroupBy)

简介 在 .NET 8 之前&#xff0c;LINQ 没有内置 CountBy 和 AggregateBy 方法&#xff0c;但在 .NET 9&#xff08;C# 13&#xff09; 中&#xff0c;LINQ 正式引入了这两个新扩展方法&#xff0c;极大简化了数据分组和聚合的写法。 背景 传统的分组统计一般使用 GroupBy&#…

作者头像 李华
网站建设 2026/3/1 11:00:44

如何快速部署OneBlog:打造个人博客网站的完整指南

如何快速部署OneBlog&#xff1a;打造个人博客网站的完整指南 【免费下载链接】OneBlog :alien: OneBlog&#xff0c;一个简洁美观、功能强大并且自适应的Java博客 项目地址: https://gitcode.com/gh_mirrors/on/OneBlog OneBlog是一个基于Java开发的简洁美观且功能强大…

作者头像 李华
网站建设 2026/2/28 6:15:10

Wan2.2-T2V-A14B生成海底生物群落动态画面的生态准确性

Wan2.2-T2V-A14B生成海底生物群落动态画面的生态准确性 在纪录片制作团队为一段30秒的珊瑚礁生态镜头耗资数十万元、派遣潜水组深入太平洋偏远海域的同时&#xff0c;另一支内容团队仅用一条文本指令&#xff0c;就在数分钟内生成了视觉质量接近实拍的海底动态画面——阳光斜射…

作者头像 李华
网站建设 2026/2/27 16:15:28

Stockfish.js终极指南:快速构建Web象棋应用的最佳选择

Stockfish.js终极指南&#xff1a;快速构建Web象棋应用的最佳选择 【免费下载链接】stockfish.js The Stockfish chess engine in Javascript 项目地址: https://gitcode.com/gh_mirrors/st/stockfish.js Stockfish.js是基于WebAssembly技术的强大国际象棋引擎&#xff…

作者头像 李华
网站建设 2026/2/28 15:21:47

NukeSurvivalToolkit:终极视觉特效插件集合完全指南

NukeSurvivalToolkit&#xff1a;终极视觉特效插件集合完全指南 【免费下载链接】NukeSurvivalToolkit_publicRelease public version of the nuke survival toolkit 项目地址: https://gitcode.com/gh_mirrors/nu/NukeSurvivalToolkit_publicRelease 在当今视觉特效制作…

作者头像 李华
网站建设 2026/2/28 18:11:43

LocalAI终极教程:5分钟打造个人AI工作室

LocalAI终极教程&#xff1a;5分钟打造个人AI工作室 【免费下载链接】LocalAI 项目地址: https://gitcode.com/gh_mirrors/loc/LocalAI 还在为AI服务的高昂费用和隐私担忧而烦恼吗&#xff1f;LocalAI让您在本地计算机上零成本运行强大的AI模型&#xff0c;完全掌控数据…

作者头像 李华