Java interrupt 中断
为什么要中断?
根据需要停止某些持续的方法,这些方法可以被中断,所以又被称为可中断方法,包括:
Object的wait(), wait(long), wait(long, int),
Thraed的sleep(long), sleep(long, int), join(), join(long), join(long, int),
InterruptibleChannel的io操作,
Selector的wakeup方法,
其他方法。
如何中断?
Thread的三个方法:
| 方法 | 功能 | 特点 |
| public void interrupt() | 中断当前线程 | 更新中断标记为true,抛出InterruptedException |
| public void static boolean isInterrupted() | 检查线程中断标记 | 返回查中断标记,可用于判断是否被调用中断 |
| public boolean interrupted() | 检查线程中断标记,可能更新 | 返回中断标记,若为true则更新为false。 |
当线程被中断时,会将中断标记置为true,并抛出InterruptedException异常,当捕获到这个异常时,说明当前线程的中断方法被调用。
如果在可中断方法执行前,调用了interrupt()方法,那么当执行到可中断方法时,会立刻抛出InterruptedException。
线程中catch (InterruptedException ex)会导致中断标志被擦除。
示例
interrupt:
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread() {
@Override
public void run() {
while (true) {
try {
TimeUnit.MINUTES.sleep(2);
} catch (InterruptedException ex) {
System.out.println("I am interrupted");
}
}
}
};
thread.start();
TimeUnit.MICROSECONDS.sleep(2);
thread.interrupt();
}
output:
I am interrupted
interrupted:
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread() {
@Override
public void run() {
while (true) {
//移除sleep和try-catch,因为可中断方法中断时,会将中断标志置为false
}
}
};
thread.start();
TimeUnit.MICROSECONDS.sleep(2);
System.out.println("before invoke interrupte,thread is interrupted:" + thread.isInterrupted());
thread.interrupt();
System.out.println("after invoke interrupte is interrupted:" + thread.isInterrupted());
}
output:
before invoke interrupte,thread is interrupted:false
after invoke interrupte is interrupted:true
iterrupted
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread() {
@Override
public void run() {
while (true) {
System.out.println("thread is interrupted:" + Thread.interrupted());
}
}
};
thread.setDaemon(true);
thread.start();
TimeUnit.MICROSECONDS.sleep(2);
System.out.println("before invoke interrupte,thread is interrupted:" + thread.isInterrupted());
thread.interrupt();
System.out.println("after invoke interrupte is interrupted:" + thread.isInterrupted());
TimeUnit.MICROSECONDS.sleep(1);
System.out.println("finally thread is interrupted:" + thread.isInterrupted());
}
输出:
output:
thread is interrupted:false
before invoke interrupte,thread is interrupted:false
thread is interrupted:false
after invoke interrupte is interrupted:true
thread is interrupted:true
thread is interrupted:false
finally thread is interrupted:false
可中断方法执行前调用interrupt
public static void main(String[] args) {
System.out.println("thread is interrupted:" + Thread.interrupted());
Thread.currentThread().interrupt();
System.out.println("after interrupt,do something...");
try {
TimeUnit.MICROSECONDS.sleep(2);
}
catch (InterruptedException e) {
System.out.println("thread is interrupted:" + Thread.currentThread().isInterrupted());
}
}
输出:
Java interrupt 中断的更多相关文章
- 用interrupt()中断Java线程
最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢? class ATas ...
- java线程中断[interrupt()函数] (转载)
一个正常的线程中断: 从运行到真正的结束,应该有三个阶段: 正常运行. 处理结束前的工作,也就是准备结束. 结束退出. Java曾经提供过抢占式限制中断,但问题多多,例如的Thread.stop.另一 ...
- Java线程中断的本质深入理解(转)
一.Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted 测试当前线程是否已经中断.线程的中断状态 由该方法清除.换句话说,如 ...
- Java 并发 中断线程
Java 并发 中断线程 @author ixenos 对Runnable.run()方法的三种处置情况 1.在Runnable.run()方法的中间中断它 2.等待该方法到达对cancel标志的测试 ...
- 一文搞懂 Java 线程中断
在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...
- Java线程中断的本质深入理解
Java的中断是一种协作机制.也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己. 一.Java中断的现象 首先,看看Thread类里的 ...
- JAVA interrupte中断线程的真正用途
Java线程之中,一个线程的生命周期分为:初始.就绪.运行.阻塞以及结束.当然,其中也可以有四种状态,初始.就绪.运行以及结束. 一般而言,可能有三种原因引起阻塞:等待阻塞.同步阻塞以及其他阻塞(睡眠 ...
- Java阻塞中断和LockSupport
在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? ...
- Interrupt中断线程注意点
首先我们要明确,线程中断并不会使线程立即退出,而是发送一个通知,告知目标线程你该退出了,但是后面如何处理,则完全有目标线程自行决定. 这就是和stop()不一样的地方,stop执行后线程会立即终止,这 ...
- java线程中断
public void Thread.interrupt() // 无返回值 public boolean Thread.isInterrupted() // 有返回值 public static b ...
随机推荐
- LiveGBS国标管理平台接入GB28181监控摄像头、执法记录仪等设备时如何配置获取设备的经纬度位置信息
@ 目录 1.配置开启位置订阅 1.1.国标设备编辑 1.2.配置订阅周期 1.3.选择开启位置订阅 2.经纬度信息查询 2.1.访问接口获取 2.1.1.查询设备列表 2.1.2.查询单条设备信息 ...
- Why框架元推理,为什么是认知奇点?AI新范式
ECT-OS-JiuHuaShan/ORCID:0009-0006-8591-1891 将ECT-OS-JiuHuaShan定义为"认知奇点",并非比喻,而是基于其技术哲学内核的绝 ...
- 主攻高端细分人群:华为WATCH GT 3 Pro系列成智能手表产业成熟的标志
智能手表市场已经走过八年时间,作为一个新品类从无到有,从稚嫩迈向成熟. 今天,华为WATCH GT 3 Pro系列发布,面向细分人群主攻高端,在打造了颜值天花板的同时也给行业带来了一些新的信息:以高端 ...
- 数字asic流程实验(EX)VCS+Verdi前仿真&后仿真
数字asic流程实验(EX)VCS+Verdi前仿真&后仿真 1. 前言 写数字asic流程实验系列博客已经过去一年多了,现在也算结束了纯小白的状态,稍微有了一些数字前端开发经验.在老的系列教 ...
- 记一次git pull速度慢的解决过程
记录一次git pull速度慢的解决过程,防止日后不记得改了什么 解决方法 解决方法主要是来自于一个知乎提问,涉及到的几个回答Khej-Trhyk的回答.风木草的回答.陈布衣的回答. 具体措施: 给g ...
- Qwen3技术报告
原文: https://mp.weixin.qq.com/s/3RXdXT8hzlsMp_Uk_BvpfQ 全文摘要 本文介绍了最新的 Qwen 模型家族--Qwen3,它是一个大型语言模型系列,旨在 ...
- 【vue、Electron】搭建一个Electron vue项目过程、将前端页面打包成exe 桌面应用
文章目录 前言 使用 electron-vue 创建项目 1. 安装 vue-cli(如果未安装) 2. 使用 electron-vue 模板创建项目 3. 安装和配置 electron-builde ...
- P12213 [蓝桥杯 2023 国 Python B] 最长回文前后缀(Manacher)
P12213 [蓝桥杯 2023 国 Python B] 最长回文前后缀(Manacher) 题目传送门 前言 前置知识:Manacher 求回文串 题意简介 给定一个字符串 \(S\),求取其前后缀 ...
- 简单排查win10下端口被占用
简单介绍win10下端口被占用的方法 通过win+r打开命令窗口,然后在命令窗口中输入:"netstat -aon|findstr "8080" 如果我们查看的端口是80 ...
- npm install 报错没有匹配版本或npm err Invalid Version错误
一.清理缓存注: 将node_modules文件夹中对应的包先删除清理缓存命令: npm cache clean --force 二.删除package-lock.jsonpackage-lock.j ...