Java 线程中断相关方法:interrupt() isInterrupted() interrupted()
interrupt() 方法只是改变中断状态而已,它不会中断一个正在运行的线程。如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常。
使用stop方法虽然可以强行终止正在运行或挂起的线程,但使用stop方法是很危险的,可能会产生不可预料的结果,因此,并不推荐使用stop方法来终止线程。Thread.interrupt()方法: 作用是中断线程。将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。它并不像stop方法那样会中断一个正在运行的线程 interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。Java虚拟机对会抛出InterruptedException异常的方法进行了特别处理:Java虚拟机会将该线程的中断标志位清除,然后抛出InterruptedException,这个时候调用isInterrupted方法返回的也是false。
一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。
(1)interrupt:置线程的中断状态。
(2)isInterrupted:测试线程(*调用该方法的线程*)是否已经中断,不清除中断状态。
(3)interrupted:测试当前线程(当前线程是指运行interrupted()方法的线程)是否已经中断,且清除中断状态。
看源码可以得知:interrupted方法底层就是调用了清除标志位的isInterrupted方法。
public boolean isInterrupted() {
return isInterrupted(false);
}
private native boolean isInterrupted(boolean ClearInterrupted);
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
演示demo:
public class Test {
public static void main(String[] args) {
/* testWait();
占有锁
interrupt标志位: false
interrupt标志位: true
线程中断*/
/* testSleep();
interrupt标志位: false
interrupt标志位: true
线程testSleepTread中断*/
/* testJoin();
Task is interrupted*/
}
public static void testSleep() {
Runnable testSleepTread = () -> {
try {
Thread.sleep(1000 * 50);
} catch (InterruptedException e) {
System.out.println("线程testSleepTread中断");
}
};
Thread thread1 = new Thread(testSleepTread);
thread1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("interrupt标志位: " + thread1.isInterrupted());
thread1.interrupt();
System.out.println("interrupt标志位: " + thread1.isInterrupted());
}
public static void testWait() {
Object lock = new Object();
Runnable testWaitTread = () -> {
synchronized (lock) {
System.out.println("占有锁");
try {
lock.wait();
} catch (InterruptedException e) {
System.out.println("线程中断");
}
}
};
Thread threadHasLock = new Thread(testWaitTread);
threadHasLock.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("interrupt标志位: " + threadHasLock.isInterrupted());
threadHasLock.interrupt();
System.out.println("interrupt标志位: " + threadHasLock.isInterrupted());
}
public static void testJoin() {
Thread thread1 = new Thread(new Task());
thread1.start();
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class Task implements Runnable {
@Override
public void run() {
try {
Thread.currentThread().interrupt();
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Task is interrupted");
}
}
}
}
Java 线程中断相关方法:interrupt() isInterrupted() interrupted()的更多相关文章
- java线程中的interrupt,isInterrupt,interrupted方法
在java的线程Thread类中有三个方法,比较容易混淆,在这里解释一下 (1)interrupt:置线程的中断状态 (2)isInterrupt:线程是否中断 (3)interrupted:返回线程 ...
- Thread线程中断相关方法
public class Demo { /* * 线程中断相关方法 * ---------------------------------------------------------------- ...
- 一文搞懂 Java 线程中断
在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...
- 线程中断方法interrupt() 与 cancel()
(一).关于interrupt() interrupt()并不直接中断线程,而是设定一个中断标识,然后由程序进行中断检查,确定是否中断. 1. sleep() & interr ...
- Java 线程的终止-interrupt
Java线程的终止——interrupt 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种 ...
- 从头认识java-17.2 线程中断(interrupt)
这一章节我们来讨论一下线程中断(interrupt). 1.什么是线程中断(interrupt)? 就是在多线程执行的时候,我们给线程贴上一个中断的标记.可是不要求线程终止. 2.样例: 中断的样例: ...
- java线程中断[interrupt()函数] (转载)
一个正常的线程中断: 从运行到真正的结束,应该有三个阶段: 正常运行. 处理结束前的工作,也就是准备结束. 结束退出. Java曾经提供过抢占式限制中断,但问题多多,例如的Thread.stop.另一 ...
- java线程中断和终止线程运行
ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程 ...
- Java线程中断的本质深入理解(转)
一.Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted 测试当前线程是否已经中断.线程的中断状态 由该方法清除.换句话说,如 ...
- Java - 线程Join与interrupt
Java多线程系列--“基础篇”08之 join() 概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_ ...
随机推荐
- js里一些实在想不通的问题合集
The global NaN property is a value representing Not-A-Number. --MDN NaN 是用来表示一个非数字的值得全局属性, 但是typeof之 ...
- Django项目如何配置日志文件信息
1.以dict的方式配置在settings.py中 # 日志文件简单配置 ''' LOGGING = { "version": 1, "disable_existing_ ...
- IDEA 使用GIt提交代码时,如果不小心提交了不需要提交的内容,在本地仓库中,此时需要回滚版本,如何回滚
选择上次提交的提交记录 选择上次提交的提交记录复制版本号 选中项目的Git重置器 填入刚复制的回滚版本号-点击Reset 这样一来就回滚回去了,本地提交就没了
- Portainer安装配置
什么是portainer 官网:https://www.portainer.io/ Portainer(基于 Go) 是一个轻量级的Web管理界面,可让您轻松管理 Docker 主机 或 Swarm ...
- Chrome 133 版本开发者工具(DevTools)更新内容
Chrome 133 版本开发者工具(DevTools)更新内容 一.持久化的 AI 聊天记录 AI 助手面板会在本地持久化聊天记录,即使重新加载 DevTools 或 Chrome,也可以查看之前与 ...
- 网络编程-关闭连接(2)-Java的NIO在关闭socket时,究竟用了哪个系统调用函数?
背景 在上一讲网络编程-关闭连接-C/C++相关系统调用中,提到过,目前项目使用Netty框架来实现的网络编程,查看netty源码可以得知,netty最终是调用了java Nio的close接口做的关 ...
- 【Java】关键字的使用
java中有很多的关键字,他们的使用让Java语言变得更加灵活.易用,下面将介绍Java中最常用的几个关键字并说明其用法. 一.关键字:return--跳出 使用在方法体中,用于:① 结束方法② 针对 ...
- JAVA基础之多线程三期--线程安全问题
一.线程安全问题就是指:多个线程并发访问同一个资源而发生安全性的问题, 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写 操作,一般来说,这个全局变量是 ...
- 🎀chrome-截图录屏插件-Awesome Screenshot
简介 Awesome Screenshot 截图录屏是一款浏览器扩展程序,它可以帮助用户进行网页截图.编辑图片以及录制屏幕视频 版本 4.4.22 功能 截图:可以截取整个网页(即使是需要滚动才能看到 ...
- nodejs使用sequelize vscode报错:Type 'Model<any, any, any>' is not a constructor function type.的解决办法
我的模型定义如下: import { Model, DataTypes } from "sequelize"; // 定义资源模型 class Rule extends Model ...