文档章节

Thread中断的理解

k
 karma123
发布于 10/16 09:39
字数 577
阅读 6
收藏 0
JDK

★中断的理解:1)中断可以理解为线程的一个标识位属性;2)表示一个运行中的线程是否被其他线程进行了中断操作

中断好比其他线程向该线程打了个招呼,其他线程通过调用该线程的interrupt()方法对其进行中断操作。

啥意思?

如上图中所示,运行中的线程(main主线程)调用线程countThread的interrupt()方法,向countThread线程打了个“招呼”,对countThread线程做了中断操作。我们看JDK源码中interrupt()方法的源码:

看注释:

// Just to set the interrupt flag

说的非常明白,对标识位进行了设置。就是将 interrupt flag 设置为true。将线程的中断标识位 interrupt flag 属性设置为了true。

为什么说【中断可以理解为线程的一个标识位属性】?

什么叫可以理解为?看一下Thread的JDK源码,实际上找不到这个属性,所以如果有这个属性的话,恐怕也是在更底层(比JDK源码更底层)存在的。所以为了更好的理解,不妨想象有那么一个变量,用来标识线程是否被中断。

线程A可以通过调用线程B的

public void interrupt() {
    if (this != Thread.currentThread())
        checkAccess();

    synchronized (blockerLock) {
        Interruptible b = blocker;
        if (b != null) {
            interrupt0();           // Just to set the interrupt flag
            b.interrupt(this);
            return;
        }
    }
    interrupt0();
}

方法来对线程B进行中断(可以理解为线程A通过调用线程B的interrupe()方法设置了线程B的中断标识位)。

线程A可以通过调用线程B的

public boolean isInterrupted() {
    return isInterrupted(false);
}

方法来查看线程B是否被设置了中断标识位(中断标识位是否为true),并且不清除中断标识位。

线程A可以通过调用静态方法

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

方法来对当前线程的中断标识位进行复位。

© 著作权归作者所有

共有 人打赏支持
k
粉丝 8
博文 86
码字总数 64740
作品 0
丰台
私信 提问
Java, Thread的interrupt()方法调用问题。

多线程环境下,调用自身interrupt()方法, 主线程周期性检查,调用子线程isInterrupted()方法,但是仿佛子线程的中断不可见, 无论什么时候子线程都返回 false表示未被中断。 让我不解的是,...

Quintus
2012/05/05
850
0
对Java中interrupt、interrupted和isInterrupted的理解

今天在看到Thread类的isInterrupted方法可以获取线程的中断状态: 于是写了个例子想验证一下: 内容很简答:主线程main启动了一个子线程Worker,然后让worker睡500ms,而main睡200ms,之后m...

摆渡者
2016/11/13
552
2
关于interrupt

Thread类中有这么几个方法: public void interrupt() public static boolean interrupted() public boolean isInterrupted() interrupt() 中断线程。 如果当前线程没有中断自己(这在任何情...

牧师-Panda
2016/09/07
6
0
java.util.concurrent.locks.LockSupport

要学习JAVA中是如何实现线程间的锁,就得从LockSupport这个类先说起,因为这个类实现了底层的一些方法,各种的锁实现都是这个基础上发展而来的。这个类方法很少,但理解起来需要花费一点时间...

黑妹妹牙膏
2014/06/22
0
5
Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语

Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功能。使用方法也很简单: public fin...

张升强
2014/03/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

phpstorm xdebug 配置

xdebug方便了调试代码,比起一个一个地方的打印结果还是debug看的更明白下面介绍下maxOS系统下的debug配置 下载 https://xdebug.org/download.php 点击红线部分进入,粘贴phpinfo()信息推荐适...

被猪拱了的JAVA
24分钟前
2
0
Golang学习笔记(1)

基本知识 golang的文件格式以go结尾。 运行方式 go run main.go 用于开发调试使用 编译成二进制文件 go build main.go 会生成一个可执行的二进制文件 变量 变量定义的形式 Golang的变量定义有...

ExtreU
38分钟前
1
0
基于Kafka构建事件溯源模式的微服务

概要 本文中我们将讨论如何借助Kafka实现分布式消息管理,使用事件溯源(Event Sourcing)模式实现原子化数据处理,使用CQRS模式(Command-Query Responsibility Segregation )实现查询职责...

架构师springboot
44分钟前
1
0
git上传项目步骤

https://blog.csdn.net/m0_37725003/article/details/80904824

fame_yao
45分钟前
1
0
NOOBS自定义安装多系统

一、预置条件: 宿主系统是win10_x64 virtual box 虚拟机,安装了centos7 树莓派的系统安装工具:NOOBS_v2_9_0.zip,镜像文件 二、根据镜像文件生成boot.tar.xz 和root.tar.xz 1、设置共享目...

mbzhong
55分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部