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. js里一些实在想不通的问题合集

    The global NaN property is a value representing Not-A-Number. --MDN NaN 是用来表示一个非数字的值得全局属性, 但是typeof之 ...

  2. Django项目如何配置日志文件信息

    1.以dict的方式配置在settings.py中 # 日志文件简单配置 ''' LOGGING = { "version": 1, "disable_existing_ ...

  3. IDEA 使用GIt提交代码时,如果不小心提交了不需要提交的内容,在本地仓库中,此时需要回滚版本,如何回滚

    选择上次提交的提交记录 选择上次提交的提交记录复制版本号 选中项目的Git重置器 填入刚复制的回滚版本号-点击Reset 这样一来就回滚回去了,本地提交就没了

  4. Portainer安装配置

    什么是portainer 官网:https://www.portainer.io/ Portainer(基于 Go) 是一个轻量级的Web管理界面,可让您轻松管理 Docker 主机 或 Swarm ...

  5. Chrome 133 版本开发者工具(DevTools)更新内容

    Chrome 133 版本开发者工具(DevTools)更新内容 一.持久化的 AI 聊天记录 AI 助手面板会在本地持久化聊天记录,即使重新加载 DevTools 或 Chrome,也可以查看之前与 ...

  6. 网络编程-关闭连接(2)-Java的NIO在关闭socket时,究竟用了哪个系统调用函数?

    背景 在上一讲网络编程-关闭连接-C/C++相关系统调用中,提到过,目前项目使用Netty框架来实现的网络编程,查看netty源码可以得知,netty最终是调用了java Nio的close接口做的关 ...

  7. 【Java】关键字的使用

    java中有很多的关键字,他们的使用让Java语言变得更加灵活.易用,下面将介绍Java中最常用的几个关键字并说明其用法. 一.关键字:return--跳出 使用在方法体中,用于:① 结束方法② 针对 ...

  8. JAVA基础之多线程三期--线程安全问题

    一.线程安全问题就是指:多个线程并发访问同一个资源而发生安全性的问题, 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写 操作,一般来说,这个全局变量是 ...

  9. 🎀chrome-截图录屏插件-Awesome Screenshot

    简介 Awesome Screenshot 截图录屏是一款浏览器扩展程序,它可以帮助用户进行网页截图.编辑图片以及录制屏幕视频 版本 4.4.22 功能 截图:可以截取整个网页(即使是需要滚动才能看到 ...

  10. nodejs使用sequelize vscode报错:Type 'Model<any, any, any>' is not a constructor function type.的解决办法

    我的模型定义如下: import { Model, DataTypes } from "sequelize"; // 定义资源模型 class Rule extends Model ...