当前位置: 首页 > news >正文

线程中断机制

如何中断一个线程?

        首先一个线程不应该由其他线程来强制中断或者停止,而是应该由线程自己自行停止。所以我们看到线程的stop()、resume()、suspend()等方法已经被标记为过时了。

        其次在java中没有办法立即停止一个线程,然而停止线程显得尤为重要,比如取消一个耗时的操作。因此java提供了一种用于停止线程的协商机制 - 中断,也就是中断标识协商机制。如果你要中断一个线程,你需要手动调用该线程的interrupt方法,改方法仅仅将该线程对象的中断标设置成true,接着程序员需要自己写代码不断的检测当前线程的标识位。

中断线程三个相关方法

interrupt()

        该方法是一个实例方法,仅仅是设置线程的中断标识状态为true,发起一个协商而不会立即停止改线程。

interrupted()

        该方法是一个静态方法,判断线程是否被中断并清除当前线程中断状态。该方法干了两个事情:

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

isInterrupted()

        该方法是一个实例方法,判断当前线程是否被中断

中断一个线程的正确姿势

volatile关键字修饰的变量

    static volatile boolean volatileStop = false;public static void main(String[] args) {new Thread(() -> {while (true) {if (volatileStop) {System.out.println(Thread.currentThread().getName() + ",跳出当前循环");break;}System.out.println(Thread.currentThread().getName() + ",hell volatile");}}, "A").start();try {TimeUnit.MILLISECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> {volatileStop = true;}, "B").start();}

通过AtomicBoolean

   static AtomicBoolean atomicStop = new AtomicBoolean();public static void main(String[] args) {new Thread(() -> {while (true) {if (atomicStop.get()) {System.out.println(Thread.currentThread().getName() + ",atomicStop被设置成true,跳出当前循环");break;}System.out.println(Thread.currentThread().getName() + ",hell AtomicBoolean");}}, "A").start();try {TimeUnit.MILLISECONDS.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> {atomicStop.set(true);}, "B").start();}

通过Thread自带的api:insterrupt()方法和isInterrupted()方法

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

public static void main(String[] args) {Thread a= new Thread(() -> {while (true) {if (Thread.currentThread().isInterrupted()) {System.out.println(Thread.currentThread().getName() + ",isInterrupted 被设置成true,跳出当前循环");break;}System.out.println(Thread.currentThread().getName() + ",hell interrupt api");}}, "A");a.start();try {TimeUnit.MILLISECONDS.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> {a.interrupt();}, "B").start();}

总结

        当对一个线程调用interrupt()方法时:

  1. 如果线程处于正常活动状态,那么会将该线程的中断标志位设置为true,仅此而已。被设置中断标识的线程将继续正常运行,不受影响。所以interrupt()方法并不能真正的中断线程,需要被调用方的线程自己配合好才行。
  2. 如果线程处于被阻塞状态(例如:sleep、wait、join等),在别的线程中调用interrupt方法,那么该线程将立即退出阻塞状态,并抛出一个InterruptedException异常,且会清除线程的中断状态。
  3. 如果线程已经中断、不活动将不会有任何影响。

相关文章:

线程中断机制

如何中断一个线程? 首先一个线程不应该由其他线程来强制中断或者停止,而是应该由线程自己自行停止。所以我们看到线程的stop()、resume()、suspend()等方法已经被标记为过时了。 其次在java中没有办法立即停止一个线程,然而停止线程显得尤为重…...

CollectionUtils工具类的使用

来自:小小程序员。 本文仅作记录 org.apache.commons.collections包下的CollectionUtils工具类,下面说说它的用法: 一、集合判空 通过CollectionUtils工具类的isEmpty方法可以轻松判断集合是否为空,isNotEmpty方法判断集合不为…...

基于Nonconvex规划的配电网重构研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

yolo系列笔记(v4-v5)

YOLOv4 YOLOv4网络详解_哔哩哔哩_bilibili 网络结构,在Yolov3的Darknet的基础上增加了CSP结构。 CSP的优点: 加强CNN的学习能力 去除计算瓶颈。 减少显存的消耗。 结构为: 、 其实还是类似与残差网络的结构,保留下采样之前…...

小白如何高效刷题Leetcode?

文章目录 为什么会有这样的现象?研究与学习人生而有别 如何解决困境?1. 要补的:化抽象为具体,列举找规律2. 要补的:前人总结的套路3. 与人交流探讨4. 多写总结文章 总结 明明自觉学会了不少知识,可真正开始…...

使用IDEA打jar包的详细图文教程

1. 点击intellij idea左上角的“File”菜单 -> Project Structure 2. 点击"Artifacts" -> 绿色的"" -> “JAR” -> Empty 3. Name栏填入自定义的名字,Output ditectory 选择 jar 包目标目录,Available Elements 里右击…...

《MySQL 实战 45 讲》课程学习笔记(二)

日志系统:一条 SQL 更新语句是如何执行的? 与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)。 重要的日志模块:redo l…...

微软亚研院提出模型基础架构RetNet或将成为Transformer有力继承者

作为全新的神经网络架构,RetNet 同时实现了良好的扩展结果、并行训练、低成本部署和高效推理。这些特性将使 RetNet 有可能成为继 Transformer 之后大语言模型基础网络架构的有力继承者。实验数据也显示,在语言建模任务上: RetNet 可以达到与…...

探索单例模式:设计模式中的瑰宝

文章目录 常用的设计模式有以下几种:一.创建型模式(Creational Patterns):二.结构型模式(Structural Patterns):三.行为型模式(Behavioral Patterns):四.并发…...

Bobo String Construction 2023牛客暑期多校训练营4-A

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;给出一字符串t&#xff0c;求一个长为n的字符串&#xff0c;使tst中包含且仅包含两个t 1<n<1000;测试样例组数<1000 思路&#xff1a;一开始很容易想到如果t里有1&#xff0c;s就全0&#xff0c;否则s就全…...

【React学习】React父子组件通讯

1. 父到子传值 在React框架中&#xff0c;父组件可以通过 props 将数据传递给子组件。子组件通过读取 props 来访问父组件传递过来的数据。 当父组件的 props 发生变化时&#xff0c;React 会自动重新渲染子组件以确保子组件中使用的数据保持同步。 父组件 import React, {…...

NASM汇编

1. 前置知识 1. 汇编语言两种风格 intel&#xff1a;我们学的NASM就属于Intel风格AT&T&#xff1a;GCC后端工具默认使用这种风格&#xff0c;当然我们也可以加选项改成intel风格 2. 代码 1. 段分布 .text: 存放的是二进制机器码&#xff0c;只读.data: 存放有初始化的…...

第三章 HL7 架构和可用工具 - 使用 HL7 架构结构页面

文章目录 第三章 HL7 架构和可用工具 - 使用 HL7 架构结构页面使用 HL7 架构结构页面查看文档类型列表查看消息结构查看段结构 第三章 HL7 架构和可用工具 - 使用 HL7 架构结构页面 使用 HL7 架构结构页面 通过 HL7 架构页面&#xff0c;可以导入和查看 HL7 版本 2 架构规范。…...

spring注解驱动开发(一)

1、需要导入的spring框架的依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.12.RELEASE</version></dependency>2、Configuration 设置类为配置类 3、Annota…...

Vue3搭建启动

Vue3搭建&启动 一、创建项目二、启动项目三、配置项目1、添加编辑器配置文件2、配置别名3、处理sass/scss4、处理tsx(不用的话可以不处理) 四、添加Eslint 一、创建项目 npm create vite 1.project-name 输入项目名vue3-vite 2.select a framework 选择框架 3.select a var…...

阻塞队列(模拟实现)

概念 阻塞队列是带有阻塞功能的队列 特性 当队列满的时候&#xff0c;继续入队列&#xff0c;就会出现阻塞&#xff0c;阻塞到其他线程从队列中取走元素为止 当队列空的时候&#xff0c;继续出队列&#xff0c;也会发生阻塞&#xff0c;阻塞到其他线程往队列中添加元素为止 特…...

VScode中python的相对路径与绝对路径 FileNotFoundError: [Errno 2] No such file or directory

VScode中&#xff0c;python里的相对路径是相对于当前工作目录来定位的&#xff0c;而当前的工作目录在VScode中下方的终端窗口会有提示&#xff1a; 说明此时的工作目录并非当前python文件所在的目录&#xff0c;而是C:\Users\xxxxx(你的用户名)。因此&#xff0c;使用VScode…...

Unity XML2——C#读写XML

一、XML 文件的存放位置 &#xff08;一&#xff09;只读不写的 XML ​ 放在 Resouces 或者 StreamingAssets 文件夹下&#xff0c;详见 Unity基础3——Resources资源动态加载_weixin_53163894的博客-CSDN博客。 &#xff08;二&#xff09;动态存储的 XML ​ 放在 Applica…...

带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库&#xff0c;编译出的库适合香橙派&#xff0c;这时候交叉编译可执行程序的平台和链接库的格式也是正确的&#xff0c;然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置&#xff0c;但是现在还没有学习过&#xf…...

数据仓库基础知识

什么是数据仓库&#xff1f; 数仓&#xff0c;DataWarehouse&#xff0c;是一个 面向主题的、集成的、稳定的、与时间相关的 数据集合。 而这个数据集合的建立&#xff0c;是为了支持管理者的决策过程。 也就是说&#xff0c;我们通过建设数仓&#xff0c;为业务中的流程改进、…...

技术解码:ViGEmBus虚拟手柄驱动框架 - 重新定义Windows输入设备模拟的底层架构

技术解码&#xff1a;ViGEmBus虚拟手柄驱动框架 - 重新定义Windows输入设备模拟的底层架构 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款基…...

保姆级教程:YOLOv8轻量化模型从训练到安卓部署全流程(附避坑指南)

保姆级教程&#xff1a;YOLOv8轻量化模型从训练到安卓部署全流程&#xff08;附避坑指南&#xff09; 在移动端实现实时目标检测一直是计算机视觉领域的热门方向。YOLOv8作为当前最先进的检测模型之一&#xff0c;其轻量化版本在安卓设备上的部署需求日益增长。本文将手把手带…...

Wan2.2-I2V-A14B企业应用:法律文书解读AI动画视频生成系统

Wan2.2-I2V-A14B企业应用&#xff1a;法律文书解读AI动画视频生成系统 1. 系统概述与核心价值 法律行业每天需要处理大量文书材料&#xff0c;传统的人工解读和可视化呈现方式效率低下且成本高昂。Wan2.2-I2V-A14B法律文书解读AI动画视频生成系统正是为解决这一痛点而生。 这…...

一步步教你获取ADNI影像数据:从搜索到下载全流程解析

1. ADNI数据库简介与准备工作 ADNI&#xff08;Alzheimers Disease Neuroimaging Initiative&#xff09;是全球最权威的阿尔茨海默病研究数据库之一&#xff0c;包含了大量脑部影像数据和临床信息。第一次接触这个数据库的研究者可能会被复杂的界面和操作流程吓到&#xff0c;…...

【以太网帧格式】

以太网帧格式一、顺序二、分析一、顺序 前导码 | 帧开始定界符 | 目的MAC | 源MAC | 类型&#xff08;长度&#xff09; | 数据字段 | 帧校验序列FCS3 &#xff08;以太网帧最小帧长&#xff1a;64 字节&#xff0c;最大帧长&#xff1a;1518 字节。&#xff09; 二、分析 1…...

MATLAB实战:如何用三种噪声干扰模拟器提升脉冲雷达抗干扰能力

MATLAB实战&#xff1a;三种噪声干扰模拟器在脉冲雷达抗干扰测试中的应用 雷达系统在现代电子战中扮演着关键角色&#xff0c;而抗干扰能力是评估雷达性能的重要指标。本文将深入探讨如何利用MATLAB构建射频噪声、调幅噪声和调频噪声三种干扰模拟器&#xff0c;通过完整的代码实…...

MD500E无感观测器模型:顺逆风检测与启动功能,低速性能优越的浮点模型

MD500E无感观测器模型顺逆风检测和启动。 逆风可刹停&#xff0c;也可直接切入闭环运行。 低速性能良好&#xff0c;可零速启动&#xff0c;堵转不发散&#xff0c;可正反转切换。 提供原版论文。 电阻、电感、磁链偏差20%情况下&#xff0c;对观测器性能无影响。 注 本模型是M…...

华帝COO韩伟:破局立新,“全域协同、效率革命”迎战行业新周期

3月30日&#xff0c;华帝“人生净界”新品发布会在杭州举行。这场发布会&#xff0c;不仅官宣全新代言人张凌赫并重磅发布非遗美学瓷话套系&#xff0c;清晰地传递出华帝面向未来的战略航向。发布会上&#xff0c;华帝股份副总裁兼COO韩伟深度剖析厨电行业变革趋势&#xff0c;…...

别再只用labelme了!用ENVI 5.3的ROI工具给遥感影像打标签,效率翻倍

遥感影像标注革命&#xff1a;ENVI 5.3 ROI工具如何让深度学习标签制作效率提升300% 当无人机航拍的高清影像铺满整个屏幕&#xff0c;标注员的手指在鼠标和键盘间机械重复着点击、拖拽、保存的动作——这是许多刚接触遥感影像深度学习的研究者再熟悉不过的场景。传统标注工具在…...

Node.js——事件的监听与触发

事件的监听与触发1、EventEmitter对象2、添加和触发监听事件2.1、添加监听事件2.2、添加单次监听事件2.3、触发监听事件3、删除监听事件1、EventEmitter对象 在JavaScript中&#xff0c;通过事件可以处理许多用户的交互&#xff0c;比如鼠标的单击、键盘按键的按下、对鼠标移动…...