Java Thread.interrupt 线程中断

news/2025/1/30 13:01:53/文章来源:https://www.cnblogs.com/happy-coding/p/18694479

简介

在 Java 中,多线程编程是非常常见且必不可少的。当我们在处理多线程操作时,线程的中断和终止成为一个非常重要的话题。Thread.interrupt() 方法是 Java 提供的用于中断线程的机制。本篇博客将带您深入了解 Thread.interrupt() 的基础概念、使用方法、常见实践以及最佳实践。

目录

  1. 基础概念
  2. 使用方法
  3. 常见实践
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

Thread.interrupt() 是 Java 提供的一种用于线程间通信的机制。它的目的是传达一个请求:请求目标线程停止其当前的活动。值得注意的是,interrupt 方法本身并不会终止线程,它只是向线程发送信号,具体的行为取决于线程的实现。

中断机制

在 Java 中,中断是协作式的,这意味着一个线程可以通过调用 interrupt() 方法来请求另一个线程中断执行,但不能强制它中断。线程需要自行检测中断状态并适当地处理。

  • 中断状态:每个线程都有一个中断状态。在有线程对它调用 interrupt() 后,这个状态被设为 true
  • 响应中断:线程可以通过 Thread.interrupted()isInterrupted() 方法检测中断状态。

使用方法

基本使用

以下是使用 Thread.interrupt() 的基本步骤:

  1. 创建并启动线程。
  2. 在某个时间点,调用 interrupt() 请求线程中断。
  3. 在线程内部定期检查中断状态,并决定是否结束线程。
public class InterruptExample {public static void main(String[] args) {Thread thread = new Thread(new Task());thread.start();// 主线程休眠两秒后中断子线程try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt();}
}class Task implements Runnable {@Overridepublic void run() {while (true) {if (Thread.currentThread().isInterrupted()) {System.out.println("Thread was interrupted, stopping...");break;}System.out.println("Running...");try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("Thread sleep interrupted, stopping...");break;}}}
}

常见实践

处理中断

线程可以通过两种方式处理中断:

  1. 轮询中断状态:使用 Thread.interrupted()isInterrupted() 检测线程是否被中断。

  2. 处理中断异常:当线程在 wait(), sleep()join() 方法中被中断时,会抛出 InterruptedException 异常,可以在 catch 块中处理该异常。

重置中断状态

InterruptedException 被抛出时,中断状态被清除(即设置为 false)。如果我们希望在这种情况下继续将中断标记为 true,需要显式地调用 interrupt() 方法。

try {Thread.sleep(1000);
} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 重新设置中断状态e.printStackTrace();
}

最佳实践

  1. 及早检测:线程应该频繁地检查中断状态,并尽早做出适当的响应。

  2. 优雅响应:被请求中断后,线程应该优雅地停止执行,进行清理操作以释放资源。

  3. 不要吞掉中断信号:如果捕获了 InterruptedException,应该重新设置中断状态(如上所示)或尽可能传播中断信息。

小结

Thread.interrupt() 方法在 Java 多线程编程中非常重要。理解如何正确检测和处理中断,对于编写健壮的并发程序至关重要。通过定期检测中断状态或者处理中断异常,我们可以确保线程在被请求中断时能够优雅地退出执行。在编写高质量 Java 多线程代码时,遵循最佳实践是至关重要的。

参考资料

  1. Java 官方文档 - Thread
  2. Java 并发编程的艺术
  3. Java Concurrency in Practice - Brian Goetz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876720.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

又在折磨自己

不是吕波是滤波过年好,但我最近真的好想死,听说卡尔曼吕波很重要,为了让自己死得快一点来学学卡尔曼吕波,我对我接下来的半个月充满了绝望。 新年第一天就这么丧可不好,振作起来,人活着总要学会开开心心的,然后少管一些不开心的事情,其实别人也并没有很重要对不对,希望…

Quid faciam?

「先生、人生相談です。 この先どうなら楽ですか。 そんなの誰もわかりはしないよなんて言われますか。 ほら、苦しさなんて欲しいわけない。 何もしないで生きていたい。 青空だけが見たいのは我儘ですか。 」每到这种时候都感觉要撑不住了。 此时此刻眼眶就不禁为黏糊糊的透明…

【牛客训练记录】牛客2025年除夕娱乐赛

训练情况赛后反思 据说是临时准备的,今年好像没啥乐子题,除了两道猜猜题 A题 构造一个字符串使得 jiaran 子串至少出现 114514 次,直接输出 114514 次 jiaran点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;voi…

互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库控制舵机并多方法播放表情

前言 前面两篇文章讲了.NET IoT相关的知识点,以及硬件的GPIO的一些概念,还有点亮两个屏幕的方法,这些让大家对.NET的用途有了新的认识,那我们这回继续讲解.NET IoT的知识点,以及介绍一些好玩的东西,例如让视频通过机器人的屏幕播放起来,还有机器人的身体也能通过我们的代…

数据库物理备份:保障数据完整性和业务连续性的关键策略

title: 数据库物理备份:保障数据完整性和业务连续性的关键策略 date: 2025/1/29 updated: 2025/1/29 author: cmdragon excerpt: 在现代企业中,数据被视为最重要的资产之一。因此,确保数据的安全性、完整性和可用性是每个数据库管理员(DBA)的首要任务。在数据管理的过程…

《Operating System Concepts》阅读笔记:p1-p1

《Operating System Concepts》学习第 1 天,p1-p1 总结,总计 1 页。 一、技术总结 无。 二、英语总结(生词:1) 1.intermediary (1)intermediary: inter-("between, among") + medius("middle") c.intermediary originally referred to something or so…

【持续更新中】线段树全集

引入 一个数列,单点修改(加),区间查询(和)。 上述问题有很多种解法,如树状数组、分块、平衡树等,今天的主题是著名的线段树。 正题 (不确保按难度升序排序,自己看着目录调顺序吧) 线段树基本原理 因为需要区间查询,所以我们希望有一些捷径能将部分的数的和提前算好…

读量子霸权18读后总结与感想兼导读

《量子霸权》读书笔记,读薄率约23.48%,涵盖量子宇宙、量子计算机等读厚方向。笔记详细记录了各章节内容,亮点包括量子计算介绍、与传统计算机比较、与AI关系及平行宇宙探讨。1. 基本信息 量子霸权【美】加来道雄 著中信出版集团股份有限公司,2024年4月出版1.1. 读薄率 书籍总…

C# WinForm 自定义类型转换器重新编译后修改属性提示 InstanceDescriptor 错误的解决方案

当我们编写自定义的类型转换器比如从 TypeConverter、ExpandableObjectConverter 等继承,首次编译后,修改属性值是正常的,当再次编译后,再次修改属性则会提示如下错误: 属性“属性名”的代码生成失败。错误是: “类型转换器类名”无法将“属性名”转换为“System.Componen…

简单的javaweb

在这里我们可以看到springboots的基本结构 controller(控制器) 负责处理HTTP请求,调用相应的服务层方法,并返回视图或数据。 DailyReportController、InternalMessageController、PersonInfoController:这些是具体的控制器类,分别处理与日报、内部消息和个人信息相关的请…

AMD核显运行DeepseekR1-7b:使用mlc-llm框架,利用vulkan推理

任何支持vulkan的显卡都能跑! 本文使用的是Radeon890M核显,内存有多大就等于显存有多大。劲啊 1. 安装mlc-llm 官方文档 windows+vulkan: conda activate your-environment pip install --pre -U -f https://mlc.ai/wheels mlc-llm-nightly-cpu mlc-ai-nightly-cpulinux+vulk…