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.mzph.cn/news/777937.shtml

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

相关文章

星光/宝骏/缤果/长安 车机CarPlay手机操作破解教程V2.0版本(无需笔记本、无需笔记本、无需笔记本)

之前写了个1.0版本,由于太局限,需要用到笔记本才能操作,很多车友反馈不方便。特此出个手机版教程,简单easy,妈妈再也不用担心我搞不定啦 一、准备工作 先卸载车机上的autokit 或者 智能互联 app,这步很关…

echarts 3D示例 echart, echarts-gl

echarts官网有很多的炫酷的3D模型 来尝试实现下&#xff0c;使用原本的柱状图或者折线图代码创建echarts示例,使用cdn的方式引入echarts <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewp…

【WPF应用20】WPF 控件详解 - RepeatButton 重复按钮的使用

在 Windows Presentation Foundation (WPF) 中&#xff0c;控件是构建用户界面 (UI) 的基础。WPF 提供了丰富的控件库&#xff0c;以满足各种设计和功能需求。其中&#xff0c;RepeatButton 是一种特殊类型的按钮&#xff0c;它在用户按下并持有时会不断地触发点击事件&#xf…

.helper勒索病毒的最新威胁:如何恢复您的数据?

导言&#xff1a; 随着信息技术的不断进步&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒成为了威胁网络安全的一大隐患。.helper勒索病毒作为近期频繁出现的一种恶意软件&#xff0c;其危害性和传播速度引起了广大用户的深切关注。本文将深入探讨.helper勒索病毒…

人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践,CapsNet模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践&#xff0c;CapsNet模型结构介绍。CapsNet&#xff08;Capsule Network&#xff09;是一种创新的深度学习模型&#xff0c;由计算机科学家Geo…

灰度图像和RGB图像

灰度图像和RGB图像在医学影像处理的上下文中有着不同的意义&#xff1a; 灰度图像&#xff08;如DICOM医学图像&#xff09;&#xff1a; 窗宽&#xff08;Window Width, WW&#xff09;和窗位&#xff08;Window Level, WL&#xff09;是针对灰度图像&#xff08;特别是医学CT…

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法 ro.vendor.config.lgsi.market_name拯救者平板 Y700 ro.vendor.config.lgsi.en.market_nameLegion Tab Y700 #ro.vendor.config.lgsi.short_market_name联想平板 ZUI T # B…

SQL Server 数据库常见提权总结

前面总结了linux和Windows的提权方式以及Mysql提权&#xff0c;这篇文章讲讲SQL Server数据库的提权。 目录 基础知识 权限判定 系统数据库 存储过程 常见系统存储过程 常见扩展存储过程 xp_cmdshell扩展存储过程提权 xp_dirtree写入文件提权 sp_oacreate提权 xp_re…

Flutter 中的 ScrollNotification 为啥收不到

1. 需求 在做智家 APP 悬浮窗优化需求时&#xff0c;需要获取列表的滑动并通知悬浮窗进行收起或全部显示。 基础库同事已经把 基础逻辑整理好如下&#xff1a; NotificationListener<ScrollNotification>(onNotification: (notification){//1.监听事件的类型if (notif…

使用API有效率地管理Dynadot域名,使用API获得域名转移密码

关于Dynadot Dynadot​​​​​​​是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#x…

vue3+threejs新手从零开发卡牌游戏(十九):添加战斗事件

接上一节实现画线后&#xff0c;现在可以根据鼠标移动位置判断是否选中了对方区域怪兽卡牌&#xff1a; 修改game/index.vue代码&#xff0c;在画线方法中添加获取目标对象方法&#xff1a; const selectedCard ref() // 选中的场上card const selectedTargetCard ref() // …

ES使用copy_to小技巧

一&#xff0c;数据结构 "properties": {"type": { "type": "keyword" } ,"title": { "type": "text", "analyzer": "ik_smart" }, "long_title": { "type":…

OpenFeign原理整理【Java面试】

OpenFeign 核心流程 1.在 Spring 项目启动阶段&#xff0c;服务 A 的OpenFeign 框架会发起一个主动的扫包流程。 2.从指定的目录下扫描并加载所有被 FeignClient 注解修饰的接口&#xff0c;然后将这些接口转换成 Bean&#xff0c;统一交给 Spring 来管理。 3.根据这些接口会…

【冥想X理工科思维】场景13:系统上线遭遇崩溃…

冥想音频合集&#xff1a;职场解压冥想音频 压力场景&#xff1a; 我搭建的系统刚刚在客户那边上线不到三天&#xff0c;系统就崩溃了&#xff0c;客户打电话来对我破口大骂&#xff0c;我该如何借助冥想调整面对客户时的压力&#xff1f; 点击看大图&#xff1a; 详细说明&…

从零开始的软件开发实战:互联网医院APP搭建详解

今天&#xff0c;笔者将以“从零开始的软件开发实战&#xff1a;互联网医院APP搭建详解”为主题&#xff0c;深入探讨互联网医院APP的开发过程和关键技术。 第一步&#xff1a;需求分析和规划 互联网医院APP的主要功能包括在线挂号、医生预约、医疗咨询、健康档案管理等。我们…

uniApp使用XR-Frame创建3D场景(7)加入点击交互

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 这篇我们讲解如何与场景中的模型交互&#xff08;点击识别&#xff09; 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-mesh id"…

网络socket编程(一)——socket接口函数、面向数据报的UDP编程及测试、select函数应用

目录 一、socket简介 二、socket编程接口函数介绍 2.1 socket()函数&#xff08;创建socket&#xff09; 2.2 bind()函数&#xff08;绑定地址和端口&#xff09; 2.3 listen()函数&#xff08;设置socket为监听模式&#xff09; 2.4 accept()函数&#xff08;接受连接…

jupyter notebook的各种问题和解决办法

安装jupyter&#xff0c;无法启动&#xff0c;或者经常crash 解决办法&#xff1a; 1,不要安装anaconda全家桶&#xff0c;速度慢&#xff0c;而且会安装另外一套python和库&#xff0c;导致代码跑不起来&#xff0c;容易crash。 2&#xff0c;直接安装jupyter&#xff1a; p…

八大技术趋势案例(人工智能物联网)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

Spark-Scala语言实战(6)

在之前的文章中&#xff0c;我们学习了如何在scala中定义与使用类和对象&#xff0c;并做了几道例题。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-S…