LockSupport与线程中断机制

news2024/9/22 21:24:26

中断机制是个协商机制

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.coloradmin.cn/o/1552602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提取html工具封装和应用

提取html工具封装和应用 BeautifulSoup库和介绍BeautifulSoup使用BeautifulSoup重点方法BeautifulSoup其他方法 认证参数化实现创建json文件导包(参数化)编写测试用例技术难点--判断验证码不同 BeautifulSoup库和介绍 BeautifulSoup使用 1、导包 2、实例…

C# OpenCvSharp 轮廓检测

目录 效果 代码 下载 效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.…

kubernetes K8s的监控系统Prometheus升级Grafana,来一个酷炫的Node监控界面(二)

上一篇文章《kubernetes K8s的监控系统Prometheus安装使用(一)》中使用的监控界面总感觉监控的节点数据太少,不能快算精准的判断出数据节点运行的状况。 今天我找一款非常酷炫的多维度数据监控界面,能够非常有把握的了解到各节点的数据,以及运…

【js刷题:数据结构数组篇之长度最小的子数组】

长度最小的子数组 一、题目二、方法1.暴力解法2.滑动窗口是什么 滑动窗口的起始位置滑动窗口的结束位置 一、题目 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件…

移动端开发思考:Uniapp的上位替代选择

文章目录 前言跨平台开发技术需求技术选型uniappFlutterMAUIAvalonia安卓原生 Flutter开发尝试Avalonia开发测试测试项目新建项目代码MainViewMainViewModel 发布/存档 MAUI实战,简单略过打包和Avalonia差不多 总结 前言 作为C# .NET程序员,我有一些移动…

虚拟机-从头配置Ubuntu18.04(包括anaconda,cuda,cudnn,pycharm,ros,vscode)

最好先安装anaconda后cuda和cudnn,因为配置环境的时候可能conda会覆盖cuda的路径(不确定这种说法对不对,这里只是给大家的建议) 准备工作: 1.Ubuntu18.04,x86_64,amd64 虚拟机下载和虚拟机Ubu…

鸿蒙OS开发实例:【手撸服务卡片】

介绍 服务卡片指导文档位于“开发/应用模型/Stage模型开发指导/Stage模型应用组件”路径下,说明其极其重要。 本篇文章将分享实现服务卡片的过程和代码 准备 请参照[官方指导],创建一个Demo工程,选择Stage模型 鸿蒙OS开发更多内容↓点击…

cookie,sessionStorage,localStorage的区别及应用场景、http状态码含义、使用token登录、无感登录

浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互。 浏览器的存储方式有哪些? 1.cookiesH5标准前的本地存储方式兼容性好,请求头自带cookie存储量小,资源浪费…

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…

某某消消乐增加步数漏洞分析

一、漏洞简介 1) 漏洞所属游戏名及基本介绍:某某消消乐,三消游戏,类似爱消除。 2) 漏洞对应游戏版本及平台:某某消消乐Android 1.22.22。 3) 漏洞功能:增加游戏步数。 4&#xf…

zabbix通过jmx监控Tongweb7企业版(by lqw)

一.tongweb配置相关启动参数 参考Zabbix 监控 Tomcat 服务 可以在控制台页面,或者在tongweb的安装目录的bin目录下,找到external.vmoptions,进行配置: 配置内容如下: -Dcom.sun.management.jmxremote -Dcom.sun.mana…

ES学习日记(一)-------单节点安装启动

基于ES7.4.1编写,其实一开始用的最新的8.1,但是问题太多了!!!!不稳定,降到7.4 下载好的安装包上传到服务器或虚拟机,创建ES目录,命令mkdir -p /路径xxxx 复制安装包到指定路径并解压: tar zxvf elasticsearch-8.1.0-linux-x86_64.tar.gz -C /usr/local/es/ 进入bin目录安装,命…

学习transformer模型-矩阵乘法;与点积dot product的关系;计算attention

矩阵乘法: 1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。 Ankie的评论:一个人是站着的,一个人是躺着的,站着的高度躺着的长度。 在计算attention的时候…

基于单片机工业生产现场的光照强度控制系统设计

**单片机设计介绍,基于单片机工业生产现场的光照强度控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机工业生产现场的光照强度控制系统设计概要主要包括以下几个关键部分:硬件设计、…

Android Studio不显示ADB Wi-Fi和Device Explorer的解决办法

我一直使用Android Studio。最近发现打开个别项目时,不显示ADB Wi-Fi和Device Explorer的图标,而有的项目就会显示。开始以为是插件错误,于是卸载了ADB Wi-Fi插件,并重新安装。但问题依旧。 后来发现,原来是在菜单的“…

二维双指针,滑动窗口

二维双指针 思路:考虑暴力做法,我们统计前缀和,然后枚举以 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​), ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​)为左上,右下顶点的矩阵有多少是合法的,那么,这样的时间复杂度为 n 4…

【MySQL】15. 事务管理(重点) -- 1

1. CURD不加控制,会有什么问题? 2. CURD满足什么属性,能解决上述问题? 买票的过程得是原子的 ?买票互相应该不能影响 ?买完票应该要永久有效 ?买前,和买后都要是确定的状态? 3. 什么是事务? 事务就是…

ROUYI框架地址

1、原版系统地址与文档 https://gitee.com/dromara/RuoYi-Cloud-Plus?_fromgitee_search 源码地址 https://plus-doc.dromara.org/#/ruoyi-cloud-plus/home 后端地址 https://plus-doc.dromara.org/#/plus-ui/home 前端地址 前端代码地址: RuoYi-Vue-Plus: 多租户…

边缘计算与云计算总结

一. EdgeGallery 简介 MEC场景下的EdgeGallery是让资源边缘化,实时完成移动网络边缘的业务处理,MEC场景下的EdgeGallery让开发者能更便捷地使用 5G 网络能力,让5G能力在边缘触手可及。 EdgeGallery是由华为、信通院、中国移动、中国联通、…

玫瑰图和雷达图(自备)

目录 玫瑰图 数据格式 绘图基础 绘图升级(文本调整) 玫瑰图 下载数据data/2020/2020-11-24 mirrors_rfordatascience/tidytuesday - 码云 - 开源中国 (gitee.com) R语言绘图—南丁格尔玫瑰图 - 知乎 (zhihu.com) 数据格式 rm(list ls()) libr…