LockSupport与线程中断机制

中断机制是个协商机制

Interrupt():

将中断状态设置为true

Interrupted():(静态方法)

1.返回当前线程的中断状态

2.将中断状态清零并设置为false

is Interrupted():

判断当前线程是否被中断

如何停止中断运行中的线程?

一个线程不应该由其他线程来停止

案例:

方法1、2用 volatile或AtomicBoolean

t2对t1发起协商中断

源码分析

Interrupt():

底层是调用interrupt0():

发现interrupt0是native方法,调用的是底层操作系统或是第三方的函数库

就是把当前的中断标志位从false设置为true,并不是立刻停止当前线程。

如果某个线程正在调用阻塞方法,此时调用interrupt()会清除中断状态,立即退出阻塞状态并抛出中断异常。

isInterrupted():

被中断返回true,否则返回false

底层还是调的native方法

小结:

当前中断标志位设置为true是否就立即停止?

不会,仅仅将标志位设置为true。

案例

结果:

首先t1的默认标志位是false

此时发生打断,标志位置为true

线程并没有停止,而是运行完了,而且中断标志还是true

这时再让它休息2秒,打印发现中断标志位变成了false。

因为此时t1已经拜拜了👋🏻,中断不活动的线程不会有任何影响。

==================================================

案例2

如果在sleep还没结束前,被interrupt,此时则会抛出中断异常,并陷入死循环

解决方案:

重新将标志位设置为true

异常复现

1.中断标志位默认为false

2.线程t2将t1标志位设置为true,此时中断标志位为true

3.碰上正在执行的sleep函数,抛出中断异常并把中断状态置为false,结束阻塞状态,导致了无限循环

4.所以需要再catch中重新将中断标志位设置为true。

interrupted():

案例

源码分析:

底层还是调用的是isInterrupted

静态方法:这里将调用isInterrupted,参数是true,意思是需要清理中断标志位

实例方法:这里将调用isInterrupted,参数是false,不需要清理状态标志位

两个底层都是调的native方法,参数是:是否需要清除状态标志位

===========================================

LockSupprot

wait()和notify():

正常情况:

异常情况1:

wait和notify必须在Synchronized同步代码块中执行,否则会抛异常

异常情况2:

先调用notify()再调用wait(),顺序错误

程序无法唤醒

Condition的await()和signal()

正常情况:

异常情况1:

这两个方法必须放在锁块里才能正常使用:lock和unlock

异常情况2:

调用顺序错误,先调用signal()再调用await()

同样,程序无法被唤醒

LockSupport类的park()和unpark()

park():

UNSAFE类的park方法

默认不放行,0表示永久等待

所以一开始调用park方法就会被阻塞,直到发放了通行证。

底层调用的是操作系统或是第三方函数库

unpark():

能够创建锁和阻塞原语

使用案例:

异常情况1:

不会发生异常

就算先发出通知,照样能唤醒t1。先发通行证没问题

通行证不会累计,最多只能发1个

总结:

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

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

相关文章

电脑关机速度很慢怎么解决?

给电脑关机,总是要很久才完全关闭。这是因为计算机运行了太长时间,并且打开的程序太多,则关闭时间超过十秒钟,这是正常的现象。还有就是计算机升级或补丁程序更新也将导致计算机缓慢关闭。此时,建议耐心等待关闭完成。…

Redis、Mysql双写情况下,如何保证数据一致

Redis、Mysql双写情况下,如何保证数据一致 场景谈谈数据一致性三个经典的缓存模式Cache-Aside Pattern读流程写流程 Read-Through/Write-Through(读写穿透)Write behind (异步缓存写入) 操作缓存的时候,删除…

实现DevOps需要什么?

实现DevOps需要什么? 硬性要求:工具上的准备 上文提到了工具链的打通,那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下: 代码管理(SCM):GitHub、GitLab、BitBucket、SubV…

探索智慧农业精准除草,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建农田作物场景下杂草作物分割检测识别分析系统

智慧农业是未来的一个新兴赛道,随着科技的普及与落地应用,会有更加广阔的发展空间,关于农田作物场景下的项目开发实践,在我们前面的博文中也有很堵相关的实践,单大都是偏向于目标检测方向的,感兴趣可以自行…

百度智能云千帆,产业创新新引擎

本文整理自 3 月 21 日百度副总裁谢广军的主题演讲《百度智能云千帆,产业创新新引擎》。 各位领导、来宾、媒体朋友们,大家上午好。很高兴今天在石景山首钢园,和大家一起沟通和探讨大模型的发展趋势,以及百度最近一段时间的思考和…

牛客NC26 括号生成【中等 递归 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/c9addb265cdf4cdd92c092c655d164ca 思路 答案链接:https://www.lintcode.com/problem/427/solution/16924 参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参…

Llama模型下载

最近llama模型下载的方式又又变了,所以今天简单更新一篇文章,关于下载的,首先上官网,不管在哪里下载你都要去官网登记一下信息:https://llama.meta.com/llama2 然后会出现下面的信息登记网页: 我这里因为待…

软件工程学习笔记12——运行维护篇

运行维护篇 一、版本发布1、关于软件版本2、版本发布前,做好版本发布的规划3、规范好发布流程,保障发布质量 二、DevOps工程师1、什么是 DevOps 三、线上故障1、遇到线上故障,新手和高手的差距在哪里2、大厂都是怎么处理线上故障的 四、日志管…

MGRE实验

MGRE实验 1、实验要求 2、实验分析 IP地址分类 私网IP:192.168.1.0等隧道IP:192.168.5.0和192.168.6.0公网IP:15.0.0.1等 配置IP地址 配置acl访问控制列表 用于将内部网络中的私有IP地址转换为公共IP地址,以实现与外部网络的通…

helm 部署 Kube-Prometheus + Grafana + 钉钉告警部署 Kube-Prometheus

背景 角色IPK8S 版本容器运行时k8s-master-1172.16.16.108v1.24.1containerd://1.6.8k8s-node-1172.16.16.109v1.24.1containerd://1.6.8k8s-node-2172.16.16.110v1.24.1containerd://1.6.8 安装 kube-prometheus mkdir -p /data/yaml/kube-prometheus/prometheus &&…

集成在零售行业的应用

随着科技的飞速发展,集成化应用正在各行各业中发挥着越来越重要的作用。在零售行业,集成技术的广泛应用不仅提升了运营效率,还优化了顾客体验,推动了行业的转型升级。本文将深入探讨集成在零售行业的应用,并展望其未来…

深度学习论文: Attention is All You Need及其PyTorch实现

深度学习论文: Attention is All You Need及其PyTorch实现 Attention is All You Need PDF:https://arxiv.org/abs/1706.03762.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 大多数先进的神经序列转换模型采用编码器-解码器结构,其中编码器将…

MySQL 8:GROUP BY 问题解决 —— 怎么关闭ONLY_FULL_GROUP_BY (详细教程)

在使用 GROUP BY 时,我们可能会遇到以下报错: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column …… 这是因为我们在select语句中所查询的列并不被group by后面接的列所包含。 对于GROUP BY聚合操作&#xf…

flink on yarn-per job源码解析、flink on k8s介绍

Flink 架构概览–JobManager JobManager的功能主要有: 将 JobGraph 转换成 Execution Graph,最终将 Execution Graph 拿来运行Scheduler 组件负责 Task 的调度Checkpoint Coordinator 组件负责协调整个任务的 Checkpoint,包括 Checkpoint 的开始和完成通过 Actor System 与 …

8、鸿蒙学习-HAR

HAR(Harmony Archive)是静态共享包,可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上。只能作为应用模块的依赖项被引用。 一、创建…

边缘计算AI盒子目前支持的AI智能算法、视频智能分析算法有哪些,应用于大型厂矿安全生产风险管控

一、前端设备实现AI算法 主要是基于安卓的布控球实现,已有的算法包括: 1)人脸;2)车牌;3)是否佩戴安全帽;4)是否穿着工装; 可以支持定制开发 烟雾&#xf…

20221124 kafka实时数据写入Redis

一、上线结论 实现了将用户线上实时浏览的沉浸式视频信息,保存在Redis中这样一个功能。为实现沉浸式视频离线推荐到实时推荐提供了强有力的支持。目前只是应用在沉浸式场景,后续也能扩展到其他所有场景。用于两个场景:(1&#xf…

Apache Hive的基本使用语法(二)

Hive SQL操作 7、修改表 表重命名 alter table score4 rename to score5;修改表属性值 # 修改内外表属性 ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL""TRUE"); # 修改表注释 ALTER TABLE table_name SET TBLPROPERTIES (comment new_commen…

掌握Flutter底部导航栏:畅游导航之旅

1. 引言 在移动应用开发中,底部导航栏是一种常见且非常实用的用户界面元素。它提供了快速导航至不同功能模块或页面的便捷方式,使用户可以轻松访问应用程序的各个部分。在Flutter中,底部导航栏也是一项强大的功能,开发者可以利用…

寄主机显示器被快递搞坏了怎么办?怎么破?

大家好,我是平泽裕也。 最近,我在社区里看到很多关于开学后弟弟寄来的电脑显示器被快递损坏的帖子。 看到它真的让我感到难过。 如果有人的数码产品被快递损坏了,我会伤心很久。 那么今天就跟大家聊聊寄快递的一些小技巧。 作为一名曾经的…