线程中的LockSapport于线程中断(一)

news/2024/4/26 23:24:25/文章来源:https://blog.csdn.net/xiaosao_/article/details/128081354

一、LockSapport与线程中断

1、线程中断机制

1.什么是中断机制

  • 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以Thread.stop()、Thread.suspend()、等都已经废弃。
  • 在java中没有办法立即停止一条线程,然而停止线程却显的尤为重要,如取消一个耗时操作。因此,java提供了一种用于停止线程的协商机制——中断,即为中断标识协商机制
  • 中断只是一种协作协商机制,java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设为true。接着你需要自己写代码检测当前线程的标识位,如果位true,表示别的线程请求这条线程中断。
  • 每个线程对象中都有一个中断标识位,用于表示线程是否被中断,该标识位true表示中断,为false表示未中断;通过调用线程对象的interrupt方法,将该线程标识设为true;可以在别的线程中调用,也可以在自己线程调用。

2、中断机制的三大方法

  • public void interrupt()

    实例方法interrupt()仅仅是设置线程的中断状态为true,发起一个协商不会立刻停止线程

  • public void isInterrupted()

    判断当前线程是否被中断

  • public static void interrupted()

    判断线程是否被中断清除当前中断状态

    1. 返回当前线程的中断状态,测试当前线程是否已被中断
    2. 将当前线程的中断状态清零并重新设为false,清除线程的中断状态

3、面试题中断机制考点

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

  1. 通过volatile变量实现

        public static volatile boolean interrupt = false;   public static void method1() {new Thread(() -> {while (true) {if (interrupt) {System.out.println("中断状态程序停止" + interrupt);break;}System.out.println("Hello volatile");}}).start();try {TimeUnit.MILLISECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}interrupt = true;System.out.println(Thread.currentThread().getName() + "执行完毕");}
    
  2. 通过AtomicBoolean

        public static AtomicBoolean isInterrupt = new AtomicBoolean(false);//原子Boolean 用于操作多线程    
    public static void method2() {new Thread(() -> {while (true) {if (isInterrupt.get()) {System.out.println("中断状态程序停止" + interrupt);break;}System.out.println("Hello AtomicBoolean");}}).start();try {TimeUnit.MILLISECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
    //        interrupt = true;isInterrupt.set(true);System.out.println(Thread.currentThread().getName() + "执行完毕");}

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

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

相关文章

Ajax学习:如何在Chrome网络控制台查看通信报文(请求报文/响应报文)

第一步:F12开启控制台, 第二步骤:打开网络标签 然后刷新页面 在网络标签位置处,这时候会出现所有发送的请求 点击第一个:会出现内容 预览部分:是解析 观察解析结果处 标头headers:主要观察请求头和请求体部分 GET请…

2023年IB生物有什么变化?

今天我们详细了解下2023年IBDP生物新课程内容、考试评估、内容、技能发展、科学本质等详细内容。IBDP生物新课程概述 IBDP新生物课程将于2023年2月开课,2023年8月首次授课,2025年5月进行首次考试。新课程反映社会变革,更加关注技能和概念、背…

即时通讯赛道开打信创牌,WorkPlus为何独树一帜?

近期,信创火了。 随着近期国家相关政策文件的推出,未来三年,党政信创、行业信创以及央国企信创的建设,将迎来全面加速。业内人士认为:“大信创”时代或已来临! 信创是什么? 信创,…

肝了47天最终上岸美团,这份最新版千页Java八股到底是有多全面?

上周接到美团HR打来的电话(吃惊!),居然约我面试。 一面和二面都是电话面试,一面的的时候美团小哥给我一个链接,需要手写代码就在那个页面里面写。一面比较顺利,感觉美团问得挺全面的。二面的时…

【原创】关于表结构更改的大量数据的迁移方案

前言 由于公司要求做产品之间的对接,需要统一表结构和字段名,但是有些表有上亿条数据,如果直接修改表字段名和加字段每一条SQL都要执行大量时间,大概时间为加一个字段1.5小时/1亿条数据,这耗时实在太长了,…

位 运 算

位运算符 在处理整形数值时&#xff0c;可以直接对组成整形数值的各个位进行操作。这意味着可以使用屏蔽技术获得整数中的各个位&#xff08;&#xff1f;&#xff1f;&#xff09; &(与)、|(或)、^(异或)、~(非/取反) “>>” 和 “<<” 运算符将二进制位进行…

55 - 经典问题解析四(动态内存分配虚函数继承中的强制类型转换)

---- 整理自狄泰软件唐佐林老师课程 1. 关于动态内存分配 new和malloc的区别是什么&#xff1f; delete和free的区别又是什么&#xff1f; 1.1 问题一&#xff1a;new和malloc的区别 1.1.1 new关键字和malloc函数的区别 new关键字是C的一部分malloc是由C库函数提供的函数ne…

40 行 Python 代码,写一个 CPU

一、引言 CPU 如何工作&#xff1f;是困扰初级用户一个迷雾般的难题。我们可能知道诸如程序计数器、RAM、寄存器的只言片语&#xff0c;但尚未对这些部件的工作原理及整个系统的协同有清晰和总体的认识。 本文使用四十行 Python 代码来实现一个最简单的 CPU。使它可编程&…

视频怎么转换为音频文件?快来掌握这几种方式

大家平时在下载网课资源进行学习的时候&#xff0c;看久了眼睛也会开始疲劳&#xff0c;而且有些视频的画面看起来很枯燥。其实我们可以使用一些软件把视频中的音频分离出来&#xff0c;直接收听音频也可以学到知识&#xff0c;而且我们还可以处理其他的事情&#xff0c;是不是…

android接入微信API相关细节

细节1 想要接入微信&#xff0c;如接入分享微信功能、跳转小程序功能等&#xff1b;首先需要到微信开放平台申请AppId&#xff0c;如何申请在开放平台上的流程很清楚&#xff0c;就不赘述了 但有个细节就是应用包名签名&#xff0c;这个应用包名签名记得是以app有正式签名文件…

sklearn机器学习:决策树案例

系列文章目录 文章目录系列文章目录一、决策树原理1.1 定义1.2 优点1.3 缺点二、分类树2.1 函数语法2.2 案例三、回归树案例3.1 函数语法3.2 案例一、决策树原理 1.1 定义 决策树是一种用来 classification &#xff08;分类&#xff09;和 regression&#xff08;回归&#…

【树莓派不吃灰】Linux篇⑩ 学习例行性工作排程(核心概念)

目录1. 什么是例行性工作排程2. 仅运行一次的工作排程3. 循环运行的例行性工作排程4. 可唤醒停机期间的工作任务5. 重点回顾❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-11-28 ❤️❤️ 本篇更新记录 2022-11-28 ❤️&…

python>>numpy(第二讲)

章节内容 元素操作 常用的方法 广播 数组形状操作 排序数组 目录 元素操作 一些常用的方法 广播 数组形状操作 数组排序 元素操作 生成元素a np.array([1,2,3,4]) b np.ones(4)1 生成一个原来数组的n倍生成一个所有元素均跟2次方有关的数组一个计算矩阵相乘的函数判断两个…

2022王道OS 1.2 操作系统的发展与分类

2022 王道OS 操作系统的发展与分类 文章目录2022 王道OS 操作系统的发展与分类知识总览OS的发展与分类手工操作阶段批处理阶段--单道批处理系统批处理阶段--多道批处理系统分时操作系统实时操作系统其他几种OS知识回顾与重要考点文章目录2022 王道OS 操作系统的发展与分类知识总…

jsp美食管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 美食管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用serlvet dao bean mvc模式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8…

QT-MySQL QSqlDatabase: QMYSQL driver not loaded

使用Qt连接mysql数据库&#xff0c;遇到了一个问题&#xff0c;就是QT5.14.1版本在连接MySQL数据库时候&#xff0c;提示驱动加载失败&#xff0c;“QMYSQL driver not loaded” 编程环境&#xff1a;   Qt5.14.1,编译器是MSVC2017_64,是64位的。   mysql-8.0.30-winx64&am…

如何在 docker 容器使用 nginx 实现反向代理统一站点入口

在微服务架构下&#xff0c;我们会部署很多微服务来实现我们的系统。每个微服务会有不同的端口。而用户在访问我们的站点时希望通过统一的端口来访问所有的服务&#xff0c;因为在很多情况下用户只能通过 80 或者 443 端口访问外界服务。 这个时候我们就可以使用反向代理来实现…

Kubernetes集群coredns缓存容器bind: address already in use错误导致集群服务无法互通解决

coredns缓存nodelocal dns cache :53: bind: address already in use错误处理起因分析问题处理问题重启Node local dns起因 事情起因是Kubernetes集群内的服务无法互相访问了 分析问题 因为Kubernetes集群内的服务都是通过service、pod的名称作为域名到coredns解析Cluster I…

[附源码]计算机毕业设计springboot贷款申请审核管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【简单、高效、性能好】SetFit:无需Prompts的高效小样本学习

重磅推荐专栏&#xff1a; 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers&#xff0c;轻松构建属于自己的NLP智能应用&#xff01; 1. 概要 使用预训练语言模型的小样本学习&#xff08;处理只有少量标签或没有标签的数据&#xff09;已成为比较普遍的…