《架构风清扬-Java面试系列第27讲》Java中如何正确优雅关闭线程?

devtools/2024/9/22 17:03:05/

这道题也是容易答错的题目之一,原因是因为有一个stop方法容易误导大家

一般也是考核工作三年以内的小伙伴,不属于有难度的题目

但由于出现频率不低,所以,钊哥有必要跟小伙伴们聊一聊

来,老规矩,在往下看答案之前,思考下,效果更佳

1,使用标志位退出线程

这种方式是通过共享一个volatile布尔变量作为退出标志,在线程的run方法中不断检查该标志,当标志为true时,线程将自行停止执行。

来,老铁们,三二一,上代码!

// 定义一个volatile的退出标志
private volatile boolean exitFlag = false;public void run() {// 在循环中检查退出标志while (!exitFlag) {// 执行线程任务doSomeWork();// 可以加入适当的休眠或者其他同步机制// 以防死循环消耗CPU资源Thread.sleep(100);}// 清理工作(如果有)cleanup();
}// 当需要终止线程时,设置退出标志为true
public void stopThread() {exitFlag = true;
}

2,使用interrupt()中断机制

Java提供了一种协作式中断机制,通过调用Thread.interrupt()来请求线程中断,然后在线程内部通过Thread.isInterrupted()检查中断状态,并作出相应的响应。

来,老铁们,三二一,上代码!

public class InterruptibleTask implements Runnable {@Overridepublic void run() {try {// 遍历或阻塞操作时定期检查中断状态while (true) {if (Thread.currentThread().isInterrupted()) {// 检测到中断,清理并退出System.out.println("线程接收到中断请求,开始退出...");break;}// 执行线程任务doInterruptibleWork();// 如果在阻塞方法中,例如sleep,interrupt会抛出InterruptedExceptionThread.sleep(100); }} catch (InterruptedException e) {// 处理中断异常,通常重新设置中断状态,因为catch会清除它Thread.currentThread().interrupt();System.out.println("线程在阻塞方法中被中断");} finally {// 清理工作(如果有)cleanup();}}public void requestStop() {// 请求中断线程Thread.currentThread().interrupt();}
}

总结

  1. volatile boolean exitFlag 确保了多线程环境下的可见性和有序性,使得所有线程都能看到最新的标志值。
  2. Thread.currentThread().isInterrupted() 方法用于检测当前线程是否被中断,若为真则进行相应处理。
  3. 在finally块中进行必要的清理工作,确保资源得到释放。


http://www.ppmy.cn/devtools/16848.html

相关文章

计算机视觉——两视图几何求解投影矩阵

上文我提到了通过图像匹配得到基本矩阵,接下来我们要接着求解投影矩阵。 计算投影矩阵思路 假设两个投影矩阵为规范化相机,因此采用基本矩阵进行恢复。在规范化相机下, P [ I ∣ 0 ] P[I|0] P[I∣0], P ′ [ M ∣ m ] P[M|m] P′[M∣m]。…

iOS 在OC旧项目中使用Swift进行混编

iOS 在OC旧项目中使用Swift进行混编 1、创建桥接文件 ​ 第一次在Swift创建OC文件,或者第一次OC创建Swift时,xcode会提示桥接,Creat Bridging Header即可,这个文件用于Swift调用OC文件,与OC调用Swift无关。 2、在TARGETS中设置D…

数字化革新:可视化墨水屏引领基板工艺MSAP贴膜阶段迈向无纸化高端制造应用背景

随着科技的飞速发展和环境保护意识的日益增强,制造印刷电路板(PCB)行业正面临着提升生产效率、降低资源消耗和推动绿色制造的迫切需求。 问题: PCB生产过程对洁净度要求高,传统打印的纸张会有粉尘,纸屑&am…

安卓原生项目工程结构说明

.gradle 和 .idea (自动生成) .gradle 是gradle下载好的缓存,如果有配置好的 下载好的缓存 直接会拿来用 没有会下载 生成 .idea 是编辑器的配置 app 代码主逻辑 目录 项目中的代码 资源都会在里面 工作的时候的核心目录 gradle 下载安卓的构建器gradle相关的配置信…

极客蒂姆·斯威尼:用虚幻引擎,修补真实世界(上) | 人物志

大片繁茂的植被覆盖在荒废破败的建筑上,昔日光洁的红墙变得暗淡又斑驳,有几根粗壮的嫩绿藤蔓沿着墙面暗红的伤痕向天空探去。天空湛蓝如镜,而远处的高塔却又弥漫起尘埃,漠然盖过山石之间的那座木桥。 一位大叔和少女无声无息&…

Linux + mysql面试题

Linux 基础.Linux 基础说出 个以上的 Linux 命令在 RedHat 中,从 root 用户切到 userl 用户,一般用什么命令?Linux 中,一般怎么隐藏文件?在 Linux 系统中,一个文件的访问权限是 7,其含义是什么…

开源模型应用落地-LangChain高阶-事件回调-合规校验

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 通过使用langchain,用户可以直接提出问题或发送指令,而无…

Docker的网络与容器资源的控制

docker的网络 docker网络模式主要分为四类 host:在这种模式下,新创建的容器不会获得自己的网络命名空间,而是与宿主机共享。这意味着容器会使用宿主机的 IP 地址和端口,并且宿主机的网络配置(如 iptables 规则)会影响…