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()的更多相关文章

  1. java线程中的interrupt,isInterrupt,interrupted方法

    在java的线程Thread类中有三个方法,比较容易混淆,在这里解释一下 (1)interrupt:置线程的中断状态 (2)isInterrupt:线程是否中断 (3)interrupted:返回线程 ...

  2. Thread线程中断相关方法

    public class Demo { /* * 线程中断相关方法 * ---------------------------------------------------------------- ...

  3. 一文搞懂 Java 线程中断

    在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...

  4. 线程中断方法interrupt() 与 cancel()

    (一).关于interrupt()     interrupt()并不直接中断线程,而是设定一个中断标识,然后由程序进行中断检查,确定是否中断.     1. sleep() & interr ...

  5. Java 线程的终止-interrupt

    Java线程的终止——interrupt 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种 ...

  6. 从头认识java-17.2 线程中断(interrupt)

    这一章节我们来讨论一下线程中断(interrupt). 1.什么是线程中断(interrupt)? 就是在多线程执行的时候,我们给线程贴上一个中断的标记.可是不要求线程终止. 2.样例: 中断的样例: ...

  7. java线程中断[interrupt()函数] (转载)

    一个正常的线程中断: 从运行到真正的结束,应该有三个阶段: 正常运行. 处理结束前的工作,也就是准备结束. 结束退出. Java曾经提供过抢占式限制中断,但问题多多,例如的Thread.stop.另一 ...

  8. java线程中断和终止线程运行

    ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程 ...

  9. Java线程中断的本质深入理解(转)

    一.Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted 测试当前线程是否已经中断.线程的中断状态 由该方法清除.换句话说,如 ...

  10. Java - 线程Join与interrupt

    Java多线程系列--“基础篇”08之 join() 概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_ ...

随机推荐

  1. rust学习笔记(2)

    类型 有符号整数(signed integers):i8.i16.i32.i64.i128 和 isize(指针宽度) 无符号整数(unsigned integers): u8.u16.u32.u64 ...

  2. 如何用js精确计算一行文字的宽度

    之前有做过一个业务,需要在文本框输入文字的时候动态计算一行文字的宽度.并由此知道当前输入的这段文字会有几行. 如何计算? 每个文字的个数*宽度?理论上可行,但是有一个问题是不同类型的文字对应的宽度是不 ...

  3. go切片排序

    前言 有时候我们需要根据切片中的某个字段进行切片排序,但sort包中只有默认基本类型 int . float64 和 string 的排序,所以我们可以手动实现sort包的 sort.Interfac ...

  4. Shell脚本实现服务器多台免密

    简介 本脚本(auto_ssh_batch.sh)用于在多台主机之间快速配置SSH免密登录,并支持远程传输脚本/文件及执行命令.通过 pass 文件提供统一认证凭据,通过 nodes 文件定义目标主机 ...

  5. 系统自带模版在 emlog pro 1.8.0 底部信息错位问题暂时的解决方案

    问题描述 作为一名 emlog 爱好者,笔者闲暇时间经常为 emlog 系统的 Github 仓库里( https://github.com/emlog/emlog )提 pr 和修修补补,就像其他知 ...

  6. 新建一个空的 ASP.NET Core Web Application

    前言 Visual Studio 2017 下操作 1. 新建项目 2. 新建空的 ASP.NET Core Web Application 确定后,需要一小点的时间等待依赖库载入... 3. 新建完 ...

  7. FastAPI 核心安全功能与模板渲染的完整示:登录、CSRF、JWT、会话、认证和缓存功能

    以下是一个整合 FastAPI 核心安全功能与模板渲染的完整示例,基于多个技术文档的最佳实践,包含登录.CSRF.JWT.会话.认证和缓存功能: from datetime import dateti ...

  8. 自动驾驶 | 为CarLA添加一辆小米SU7 Part I

    自动驾驶 | 为CarLA添加一辆小米SU7 Part I 导言 什么是CarLA? CarLA是一款基于虚幻引擎4(Unreal Engine 4)构建的开源自动驾驶仿真平台,为自动驾驶算法的研发. ...

  9. Unity中检查重复的资源

    目的:检查Unity中资源是否重复,例如有两张贴图,明明是一张,却被复制为两份放在工程中,名字或者所在目录位置不同,这对于资源管理来说是很浪费的.因此需要写一个检查工具来检查项目中是否存在重复的资源. ...

  10. CountDownLatch的countDown()方法的底层源码

    一.CountDownLatch的构造方法 // 创建倒数闩,设置倒数的总数State的值 CountDownLatch doneSignal = new CountDownLatch(N); 二.c ...