JUC之线程中断与LockSupport

什么是中断

  • 首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。
  • 其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。
  • 中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位,如果为true,表示别的线程要求这条线程中断,此时究竟该做什么需要你自己写代码实现。
  • 每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。

中断相关API

image.png

  • interrupt()设置线程的中断标识为true;
  • interrupted()返回当前的中断标识,并将其中断标识设置为false;
  • isInterrupted()判断当前线程是否被中断;

如何使用中断标识中断线程?

在需要中断的线程中不断监听中断状态,一旦发生中断,就执行相应的中断处理业务逻辑

  1. 通过一个volatile变量实现
  2. 通过Thread类自带的中断api方法实现

当前线程的中断标识为true,是不是就立刻停止?

具体来说,当对一个线程,调用 interrupt() 时:
① 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。所以, interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行。
② 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),在别的线程中调用当前线程对象的interrupt方法,那么线程将立即退出被阻塞状态,如需要锁,则在获取锁的情况下 抛出一个InterruptedException异常。

lockInterruptibly()方法

  1. 当使用该方法获取锁时 如果在等待获取锁 则可以调用中断方法进行中断 注意在线程运行时进行中断没有任何作用(因为只是在线程中将其中断标识为true,除非自己书写代码捕获,线程不会自动中断)
  2. synchronized锁无论是获取到锁还是等待获取锁 调用中断方法都不会时线程中断. 除非在运行时自己书写代码逻辑
  3. 线程在调用wait中是时 调用中断方法会立即唤醒并在下次线程获取到锁时抛出异常 不会在调用中断方法后立即抛出异常, 并且会清除中断标记位(结束将其设置位false),当线程在sleep时,由于在调用此方法时锁并不会释放,在调用中断方法后会立即唤醒线程 由cpu再次调度后,立即抛出异常,且清除标记位;

总结

中断只是一种协同机制,修改中断标识位仅此而已,不是立刻stop打断;

LockSupport

LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。

线程等待唤醒机制

  1. 方式1:使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程;
    1. wait和notify方法必须要在同步块或者方法里面,且成对出现使用;
    2. 先wait后notify才可以;
  2. 方式2:使用JUC包中Condition的await()方法让线程等待,使用signal()方法唤醒线程;
    1. Condtion中的线程等待和唤醒方法之前,需要先获取锁;
    2. 一定要先await后signal,不要反了;
  3. 方式3:LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程;

Object和Condition使用的限制条件

  1. 线程先要获得并持有锁,必须在锁块(synchronized或lock)中;
  2. 必须要先等待后唤醒,线程才能够被唤醒;

LockSupport类中的park等待和unpark唤醒

  • 通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作
  • LockSupport类使用了一种名为Permit(许可)的概念来做到阻塞和唤醒线程的功能, 每个线程都有一个许可(permit),permit只有两个值1和零,默认是零。

park()

image.png
park方法默认是0,所以调用park方法时,会将其线程阻塞;直到别的线程将当前线程的permit设置为1时,park方法会被唤醒,然后会将permit再次设置为零并返回;

unpark(Thread thread)

在这里插入图片描述

  • LockSupport.unpark(thread); 唤醒处于阻塞状态的指定线程;
  • 调用unpark(thread)方法后,就会将thread线程的许可permit设置成1(注意多次调用unpark方法,不会累加,permit值还是1)会自动唤醒thread线程,即之前阻塞中的LockSupport.park()方法会立即返回。

注意事项

  1. park和unpark要成双成对的出现;
  2. LockSupport是创建锁与其他同步类的基本阻塞原语;
  3. LockSupport的许可证最多只有一个;

当调用park方法时:

  1. 如果没有许可证则阻塞等待;
  2. 如果有许可证则消耗掉许可证并退出阻塞状态;

当调用unpark方法时将许可证加一(许可证最多为一,调用多次累加无效)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣 -- 467. 环绕字符串中唯一的子字符串

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int findSubstringInWraproundString(string s) {int ns.size();vector<int> dp(n,1);int re…

Godot 4 源码分析 - 增加格式化字符串功能

Godot 4的主要字符串类型为String&#xff0c;已经设计得比较完善了&#xff0c;但有一个问题&#xff0c;格式化这块没怎么考虑。 String中有一个format函数&#xff0c;但这个函数只有两个参数&#xff0c;这咋用&#xff1f; String String::format(const Variant &va…

vue 新学习 06 js的prototype ,export暴露,vue组件,一个重要的内置关系

部分内容参考的这篇文章 原文链接&#xff1a;https://blog.csdn.net/harry5508/article/details/84025146 写的很好。 01 在js中&#xff1a; 原型链 注意&#xff1a;构造函数.prototype实例化对象.__proto__&#xff0c;都是指向函数的原型。 export&#xff1a; -export用…

Popover气泡卡片(antd-design组件库)简单使用

1.Popover气泡卡片 点击/鼠标移入元素&#xff0c;弹出气泡式的卡片浮层。 2.何时使用 当目标元素有进一步的描述和相关操作时&#xff0c;可以收纳到卡片中&#xff0c;根据用户的操作行为进行展现。 和 Tooltip 的区别是&#xff0c;用户可以对浮层上的元素进行操作&#xff…

项目实战 — 消息队列(5){统一硬盘操作}

前面已经使用数据库管理了交换机、绑定、队列&#xff0c;然后又使用了数据文件管理了消息。 那么&#xff0c;这里就创建一个类&#xff0c;讲之前的两个部分整合起来&#xff0c;对上层提供统一的一套接口&#xff0c;表示硬盘上存储的所有的类的信息。 /* * 用这个类来管理…

【Linux】Linux下git的使用

文章目录 一、什么是git二、git发展史三、Gitee仓库的创建1.新建仓库2.复制仓库链接3.在命令行克隆仓库3.1仓库里的.gitignore是什么3.2仓库里的git是什么 三、git的基本使用1.将克隆仓库的新增文件添加到暂存区(本地仓库)2.将暂存区的文件添加到.git仓库中3.将.git仓库中的变化…

Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。

文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到&#xff0c;发现flink运行一段时间后&#xff0c;不再继续消费的问题。这个问题困扰了我非常久&#xff0c;一开始也很迷茫。又因为比较忙&#xff0c;所以一直没有时间能够去寻找答案&#xff0c;只是通过每天重启…

如何设计一个自动化测试框架

在进行自动化框架设计之前我们先来看两个问题&#xff0c;什么是自动化框架&#xff0c;设计的时候应该注意什么原则&#xff0c;然后该怎么做&#xff1f;本文会以一个web端的UI自动化测试框架设计为例 Python自动化测试&#xff1a;2023最新合集Python自动化测试开发框架【全…

部署Tomcat和jpress应用

静态页面&#xff1a;静态页面是指在服务器上提前生成好的HTML文件&#xff0c;每次用户请求时直接返回给用户。静态页面的内容是固定的&#xff0c;不会根据用户的请求或其他条件进行变化。静态页面的优点是加载速度快&#xff0c;对服务器资源要求较低&#xff0c;但缺点是无…

fishing之踩坑篇捕获数据不齐全

文章目录 一、问题记录二、解决方法三、更新钓鱼模板四、进行点击邮件五、查看仪表盘免责声明 一、问题记录 通过点击邮件内的链接&#xff0c;提交数据&#xff0c;但是只记录密码&#xff0c;无法记录username 二、解决方法 对于需要被捕获的表单数据&#xff0c;除了inp…

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…

自然语言处理学习笔记(三)————HanLP安装与使用

目录 1.HanLP安装 2.HanLP使用 &#xff08;1&#xff09;预下载 &#xff08;2&#xff09;测试 &#xff08;3&#xff09;命令行 &#xff08;4&#xff09;测试样例 3.pyhanlp可视化 4. HanLP词性表 1.HanLP安装 HanLP的 Python接口由 pyhanlp包提供&#xff0c;其安装…

Hyper实现git bash在windows环境下多tab窗口显示

1.电脑上安装有git bash 下载链接&#xff1a;https://gitforwindows.org/ 安装Hyper 下载链接:官网 https://hyper.is/ 或者在百度云盘下载&#xff1a; https://pan.baidu.com/s/1BVjzlK0s4SgAbQgsiK1Eow 提取码&#xff1a;0r1f 设置 打开Hyper&#xff0c;依次点左上角-&g…

从特斯拉FSD v11.4.6,看FSD入华

从特斯拉FSD v11.4.6&#xff0c;看FSD入华 1. 芝加哥城区a. 亮点b. 问题 2. 小镇中心a. 亮点b. 问题 3. FSD入华a. 技术路线b. 场景 4. 参考视频 FSD最近更新了v11.4.6&#xff0c;本文根据2个FSD城区测试视频&#xff0c;一起看一下有哪些亮点和问题。 FSD入华的消息也甚嚣尘…

图像快速傅里叶变换的工业应用案例简介:图像自相关,背景纹理去除,旋转矫正,划痕检测

快速傅里叶变换是非常重要的数学分析工具&#xff0c;同时也是一种非常重要的信号处理方法。 下面借助Halcon商业图像处理库&#xff0c;介绍些工业应用案例&#xff0c;我们可以通过案例理解图像快速傅里叶变换的一些应用场景。 案例1&#xff1a;图像自相关性确定芯片间距 …

springCache-缓存

SpringCache 简介&#xff1a;是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;底层可以切换不同的cache的实现&#xff0c;具体是通过CacheManager接口实现 使用springcache,根据实现的缓存技术&#xff0c;如使用的redis,需要导入redis的依赖包 基于map缓存 …

AI编程工具Copilot与Codeium的实测对比

csdn原创谢绝转载 简介 现在没有AI编程工具&#xff0c;效率会打一个折扣&#xff0c;如果还没有&#xff0c;赶紧装起来&#xff0e; GitHub Copilot是OpenAi与github等共同开发的的AI辅助编程工具&#xff0c;基于ChatGPT驱动&#xff0c;功能强大&#xff0c;这个没人怀疑…

【100天精通python】Day27:文件与IO操作_CSV文件处理

目录 专栏导读 1. CSV文件格式简介 2 csv模块的使用方法 3 读写CSV文件的示例 3.1 读取CSV文件示例 3.2 写入CSV文件示例 4 CSV文件的常用数据处理 4.1 读取CSV文件的特定列 4.2 读取CSV文件的特定行 5 csv 文件的特殊处理 5.1 处理包含逗号、换行符、引号的字段 5.…

MySql之日志

Buffer Pool Buffer Pool &#xff08;缓冲池&#xff09;是 InnoDB 存储引擎中非常重要的内存结构&#xff0c;顾名思义&#xff0c;缓冲池其实就是类似 Redis 一样的作用&#xff0c;起到一个缓存的作用&#xff0c;因为我们都知道 MySQL 的数据最终是存储在磁盘中的&#xf…

如何通过 WordPress 数据库启用插件?【进不去后台可用】

如果您无法访问 WordPress 后台并需要激活插件以恢复访问权限&#xff0c;则可以通过 WordPress 数据库来实现。本文将向您展示如何使用数据库轻松激活 WordPress 插件。 何时使用数据库激活 WordPress 插件&#xff1f; 许多常见的 WordPress 错误会阻止网站所有者访问 WordP…