Java线程——中断线程和interrupt()

Java线程中断攻略: 详解Java线程中断及线程中断的几种使用场景 在多线程编程中,线程中断技术是确保程序健壮性和可靠性的不可或缺的一部分。本文将深入探讨Java中的线程中断技术,以通俗易懂的方式介绍其概念、机制以及在实际项目中的应用。 阅读详情

线程进入阻塞的情况

1.调用 Thread.sleep() 方法进入休眠状态;
2. 通过 wait() 使线程挂起,直到线程得到 notify() 或 notifyAll() 消息(或者 java.util.concurrent 类库中等价的 signal() 或 signalAll() 消息;
3. 等待某个 I/O 的完成;
4.试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个线程已经获得了这个锁。

interrupt()

当对一个线程调用interrupt()的几种情况

如果一个线程处于活跃状态

interrupt()方法并不会让线程中断,其所做的只是将线程的中断状态置为true,仅此而已。该如何去处理这个中断情况是有线程本身自己决定的,如果线程的写法无视了这个interrupt状态那也是可以的,这样“被中断”的线程就会不受影响,继续执行代码。
所以我们在使用interrupt()的时候,都要考虑被被中断线程的配合。


例如,我们在线程内部判断当前线程是否被设置了中断状态,如果是,就考虑如何安全的退出线程。

Thread thread = new Thread(() -> {
    while (!Thread.interrupted()) {
        // do more work.
    }
});
thread.start();

但如果我们的代码这样写

Thread thread = new Thread(() -> {
    while (true) {
        // do more work.
    }
});
thread.start();

这样根本不考虑线程的中断情况,那么就算其他线程执行了对该线程的interrupt()方法,也丝毫不起作用。

一个线程处于阻塞状态

如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。仅此而已。

值得注意的是
1.当线程处于lock对象的lock()方法和synchronized修饰的同步时,interrupt不会让他们抛出异常,如何处理决定于线程获取到锁之后的代码。
2.如果执行了wait方法之后进入等待没有被notify或者notifyAll唤醒,此时执行interrupt会让该线程抛出异常,但如果线程已经被唤醒但是没有获取到锁而阻塞的话是不会抛出异常的,因为此时就相当于和第1点相同(wait必须要和synchronized一起使用)

wait,sleep,join方法内部其实都是在不断的判断中断状态,如果被中断了就抛出异常。比如,wait方法就是不断循环的判断该对象上等待的线程的状态,如果是中断状态,就让该线程退出等待并抛出异常,所以wait方法真正抛出异常的其实是线程,而不是执行wait方法的对象。

中断状态的检测与重置

interrupted()

interrupted()是Thread的静态方法,用来判断当前线程的中断状态,如果该线程被执行了interrupt()方法的话,那么就会返回true,否则范围false。

public static void main(String[] args){
	Thread thread = new Thread(()->{
            //dosomething
       });
	thread.start();
	thread.interrupt();
	System.out.println(thread.interrupted());//返回false
}

为什么会返回false呢,我们查看一下源码

public static boolean interrupted() {
        return currentThread().isInterrupted(true);
}

interrupted()是一个静态方法,返回的永远是当前执行的线程的中断情况,所以不管他是通过哪一个对象来执行 interrupted(),结果都是一样的,在本例里面,thread.interrupted()实际上返回的就是main线程的中断情况。

isInterrupted()

isInterrupted()是实例方法,返回的是执行这个方法的对象的中断状态

   public boolean isInterrupted() {
   		return isInterrupted(false);
   }
   
   private native boolean isInterrupted(boolean ClearInterrupted);

可以看到这个地方调用的是底层的native方法,传递的一个参数ClearInterrupted用来表示是否清楚中断状态,如果被清楚了,那么中断状态就会重新被置为false。
可以看到 interrupted()方法清除了中断状态,但是isInterrupted()没有。其实也很好理解,只有当前线程自己才能清除自己的状态。

抛出异常

Object.wait(), Thread.join() 和 Thread.sleep() 三种方法在收到中断请求的时候会清除中断状态,并抛出 InterruptedException。

清除了标志位并不代表线程恢复了,只是单纯的将一个属性置为了false而已。具体如果还是要看你的代码是怎么写的。



Q:当一个线程阻塞的情况下,是否完全无法处理该线程直到获取到锁?
A:并不是,我们可以执行interrupt()方法让线程报错,然后在catch()方法捕获异常,并执行一些操作。这也可以认为是一种线程之间的交互

Java - 线程的属性和方法(sleep()、interrupt()中断线程、 join()控制线程顺序) 【 join 的行为】 阻塞调用 '线程.join' 的线程 1. 如果被等待的线程还没执行完,就阻塞等待 2. 如果被等待的线程已经执行完了,直接就返回 阅读详情

相关推荐

Java如何中断一个正在运行的线程

绍Java如何中断一个正在运行的线程

Java里一个线程调用了Thread.interrupt()到底意味着什么?

一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。 所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。 而 Thread.interrupt 的作用其实也不是中断线程,而是「通知线程应该中断了」, 具体到底中断还是继续运行,应该由被通知的线程自己处理。 具体来说,当对一个线程,调用 interrupt() 时,

wenwen360360的博客 1402

AI辅助发明专利撰写实战:30分钟高效生成高质量技术专利文档

在技术专利撰写领域,尤其是软件、算法或系统架构相关的发明专利,如何将创新的技术构思快速、规范地转化为符合《专利法》要求的申请文件,是许多开发者和技术团队面临的共同挑战。传统的人工撰写方式不仅耗时耗力,对撰写人的法律和技术双重背景要求极高,还容易因格式或术语不规范导致审查意见增多。本文将分享一套利用 AI 辅助工具,系统化、高效率地完成一篇高质量发明专利说明书撰写的实战流程。通过清晰的步骤拆解、可复制的提示词(Prompt)工程以及关键注意事项,即使是首次接触专利撰写的开发者,也能在短时间内掌握从技术方案梳理

子夜轻风 953

Java:关于Java中的线程中断的几种方法

public void interrupt() 其中interrupt()是一个实例方法它通知目标线程中断,也仅仅是设置目标线程的中断标志位为true.public boolean isInterrupted() 其中isInterrupted()方法也是一个实例方法它判断当前线程是否被中断(通过检查中断标志位)并获得中断标志public static boolean interrupted() . 该方法是Thread类的静态方法。

m0_46687972的博客 3465

【开源训练数据集2】10个最适合机器学习的股票市场数据集

​随着加密货币在世界各地的兴起,人们现在有比以往更多的投资方式。然而,这并不像低买高卖那么简单。如果你能准确预测股市,你就会成为地球上最富有的人之一。因此,之前已经有关于如何利用情绪分析来预测股市的研究。对于那些希望构建类似预测模型的人,本文将介绍 10 个用于机器学习的股票市场和加密货币数据集。

u010542847的博客 2139

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月12日-生产期间维护用的双重隔离

生产期间维护用的双重隔离。该程序用于准备将一个或多个双工位设置为维护状态,同时SABRE 3D/3DxT/3D Scimitar保持生产运行。其目的是在不中断生产的情况下将双工位与运行中的设备隔离。

weixin_46735260的博客 574

Java线程中断

1.什么是中断机制? 2.中断的相关API方法之三大方法说明 3.如何停止中断运行中的线程? 4.当前线程中的中断标识为true,是不是线程就立即停止? 5.关于静态方法Thread.interrupted()方法,谈谈你的理解

qq_45996900的博客 3622

地平线RDKX3初始配置与USB无线网卡

地平线X3无线网卡配置

Richard_Mei的博客 4077

java 终止线程的4种方式

在线程的执行代码中,使用一个布尔类型的标志位来标识线程是否需要终止。线程在执行过程中,不断地检查这个标志位,如果标志位为true,则主动退出线程执行的循环或方法,从而终止线程的执行。

文无第一,武无第二 3802

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4942

利用李雅普诺夫函数开发航天器姿态控制系统

本文基于李雅普诺夫函数控制方法,采用修正罗德里格斯参数(MRP)描述航天器姿态,设计了姿态控制律。通过构造能量型李雅普诺夫函数,推导出保证系统稳定的控制闭环方程,实现了航天器从初始状态到目标状态的稳定转换。针对MRP参数可能出现的奇异性问题,采用影子集进行规避。仿真实验包含两种模式:非追踪模式(目标状态为0)和追踪模式(目标为三角函数轨迹)。结果表明,该控制方法能够有效实现姿态稳定和轨迹跟踪,在短暂调整后即可精确跟随目标轨迹。控制律设计考虑了不同参考系间的转换,通过DCM矩阵处理目标角速度的坐标变换问题。

weixin_50227659的博客 1221

Java中的interrupt()中断线程(Interrupt 方法结束线程)-- 转载

@[TOC](Java中的interrupt()中断线程(Interrupt 方法结束线程)) 很多Java初级开发者(包括我)都知道终止一个正在运行的线程最好的方法不是JDK已废弃的stop()方法,而是用interrupt()或条件变量,但事实上真就那么简单吗? 中断可以理解为线程的一个标志位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。中断好比其它线程对该线程打了个招呼,其它线程通过调用该线程的interrupt()方法对其进行中断操作,相当于将该线程的中断标志位设置为true,而被中断的

有一颗前端心的后端开发小哥 1376

YOLO26改进策略【YOLO和Mamba】| 2024 VM-UNet,高效的特征提取模块VSS block 二次创新提高精度

VM-UNet模型设计的出发点是解决现有CNN-based和模型在医学图像分割中的局限性,利用(SSMs)的优势,提出一种更有效的医学图像分割模型。具体来说,CNN-based模型在捕捉长距离信息方面存在不足,而模型由于自注意力机制的二次复杂度导致计算负担较重。SSMs模型如Mamba不仅在建模长距离依赖方面表现出色,还具有线性计算复杂度,这为VM-UNet的设计提供了理论基础。

Limiiiing的博客 215

多线程-java 中断线程的几种方式 interrupt()

中断 中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。 首先,忘掉Thread.stop方法。虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的,这意味着,在未来的JAVA版本中,它将不复存在。 如何安全的结束一个正在运行的线程 Thread类相关的方法   ja

weixin_42707543的博客 499

PaddleOCR全版本完整指南:从入门到精通,全面解析安装部署与高级应用

摘要 本文详细介绍了PaddleOCR的完整安装与使用指南。首先讲解了环境准备步骤,包括Python 3.11虚拟环境创建和PaddlePaddle框架的CPU/GPU版本安装。接着介绍了PaddleOCR库的安装方式,可选功能模块(文档解析、信息抽取、翻译等)及其依赖组。通过示例代码演示了PPStructureV3文档解析功能的基本用法,并提供了安装验证方法。最后针对常见问题(Windows中文用户名报错、模型下载问题)给出解决方案。文章为从入门到精通的PaddleOCR用户提供了全面的技术指导。

算法工程师 1366

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java多线程技术: interrupt() 中断线程, 优雅停止线程及原理

MyThread.class package cn.yilong.edcsapiservice.thread; public class MyThread extends Thread { @Override public void run() { System.out.println("开始睡觉"); try { ...

asha2333的博客 325

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java多线程/并发08、中断线程 interrupt()

一个线程是否能让另一个线程停止运行?除了线程同步互斥机制之外,还有两种方法: 可以使用Thread.stop(), Thread.suspend(), Thread.resume() 和Runtime.runFinalizersOnExit() 这些终止线程运行的方法 。但这些方法已经被废弃(The method stop() from the type Thread is deprecated)

程序老兵的博客 962

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java多线程 使用isInterrupted() 和 interrupt()结合异常法可预知的中断线程

在Java多线程中我们可以使用stop()强行终止线程, 但是运行这个方法,会发生什么,在什么时候终止线程,这都是不可以预知的, 所以stop()方法被作废过期,取而代之的是 thread.isInterrupted() 判断中断标志是否为true **thread.interrupt()**使得中断标志为true,默认为false 单独使用thread.interrupt() TestThread .class public class TestThread extends Thread { @O

weixin_45754452的博客 276

JavaWeb~玩转Thread类 如何中断一个线程 认识线程的状态

这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,

2401_84048832的博客 831

java线程interrupt用法_Java 如何中断线程

本篇文章帮大家学习java 如何中断线程,包含了Java 如何中断线程使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。以下实例演示了如何使用interrupt()方法来中断线程并使用 isInterrupted() 方法来判断线程是否已中断:publicclassMainextendsObjectimplementsRunnable{publicvoid...

weixin_28933179的博客 111

JAVA学习笔记(四十)- 守护线程与中断线程

守护线程/* * Daemon线程,即守护线程 * 一般都在后台运行,为其他线程提供服务,不能单独存在 */ public class Test08 { public static void main(String[] args) { MyThread8 t1 = new MyThread8("守护线程"); System.out.println("是守

陆讯 1668

2021-02-25线程启动和终止

1、启动线程 线程对象在初始化完成之后,调用start()方法就可以启动这个线程。线程start()方法的含义 是:当前线程(即parent线程)同步告知Java虚拟机,只要线程规划器空闲,应立即启动调用 start()方法的线程。 注意 启动一个线程前,最好为这个线程设置线程名称,因为这样在使用jstack分析程 序或者进行问题排查时,就会给开发人员提供一些提示,自定义的线程最好能够起个名字。 2、中断线程 中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行 了中断操作。

weixin_42546729的博客 436

【多线程篇05】:详解interrupt()方法中断线程的机制

Java线程中断机制解析摘要: 线程中断是Java中的一种协作式信号机制,调用interrupt()仅设置线程的中断标志位,并不会强制终止线程。运行中的线程需通过isInterrupted()主动检查状态,而处于阻塞状态的线程(如sleep/wait时)被中断会立即抛出InterruptedException并清除中断标志。关键注意点在于:1)中断仅作为信号,线程需自行处理中断逻辑;2)捕获InterruptedException后应恢复中断状态;3)不同线程状态对中断的响应方式不同。该机制要求线程间协作,

lyh2004_08的博客 1523

Java多线程(一)线程的概念

本文目录: 进程和线程 线程创建方式 线程的状态 中断线程 守护线程 进程和线程 什么是进程和线程? 在计算机中,一个任务就是一个进程 在进程内部还需要多个子任务,每个子任务被称为线程。 一个进程可以包含一个或多个线程(至少一个)。 进程和线程的关系 一个进程可以包含一个或多个线程(至少一个线程) 线程是操作系统调度的最小任务单位 如何调度线程完全由操作系统决定 实现多任务的方法 多进程模式...

Bright 298

“全栈2019”Java多线程第六章:中断线程interrupt()方法详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 “全栈2019”Java多线程第六章:中断线程interrupt()方法详解 下一章 “全栈2019”Java多线程第七章:等待线程死亡join()方法详解 学习小组 加入同步学习小组,共同交流与进步。 方式一:关注头条号Gorhaf,私...

人人都是程序员官方博客 470

中断线程的几种方法

中断:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。 java中曾经提供过一系列

MoeYang 1727
上一篇: Java中的锁——Synchronized锁的使用
下一篇: HTTP1.1和HTTP2.0新特性
近光
博客等级 码龄10年 28粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值