interrupt(),interrupted() 和 isInterrupted() 的区别
1. 结论先行
interrupt():将调用该方法的对象所表示的线程标记一个停止标记,并不是真的停止该线程。
interrupted():获取当前线程的中断状态,并且会清除线程的状态标记。是一个是静态方法。
isInterrupted():获取调用该方法的对象所表示的线程,不会清除线程的状态标记。是一个实例方法。
现在对各方法逐一进行具体介绍:
2. interrupt()
首先我们来使用一下 interrupt() 方法,观察效果,代码如下:
public class MainTest {
@Test
public void test() {
try {
MyThread01 myThread = new MyThread01();
myThread.start();
myThread.sleep(2000);
myThread.interrupt();
} catch (Exception e) {
System.out.println("main catch");
e.printStackTrace();
}
}
}
public class MyThread01 extends Thread {
@Override
public void run() {
super.run();
for (int i = 0; i < 500; i++) {
System.out.println("i= " + i);
}
}
}
输出结果:
可以看出,子线程已经执行完成了。说明 interrupt() 方法是不能让线程停止,和我们一开始所说的那样,它仅仅是在当前线程记下一个停止标记而已。
那么这个停止标记我们又怎么知道呢?——此时就要介绍下面的 interrupted() 和 isInterrupted() 方法了。
3. interrupted() 和 isInterrupted()
interrupted() 方法的声明为
public static boolean interrupted()isInterrupted() 方法的声明为
public boolean isInterrupted()
这两个方法很相似,下面我们用程序来看下使用效果上的区别吧
先来看下使用 interrupted() 的程序。
@Test
public void test() {
try {
MyThread01 myThread = new MyThread01();
myThread.start();
myThread.sleep(1000);
// 7行: Thread.currentThread().interrupt(); // Thread.currentThread() 这里表示 main 线程
myThread.interrupt();
// myThread.interrupted() 底层调用了 currentThread().isInterrupted(true); 作用是判断当前线程是否为停止状态
System.out.println("是否中断1 " + myThread.interrupted());
System.out.println("是否中断2 " + myThread.interrupted());
} catch (InterruptedException e) {
System.out.println("main catch");
}
System.out.println("main end");
}
输出结果:
由此可以看出,线程并未停止,同时也证明了 interrupted() 方法的解释:测试当前线程是否已经中断,这个当前线程就是 main 线程,它从未中断过,所以打印结果都是 false。
那么如何使 main 线程产生中断效果呢?将上面第 8 行代码注释掉,并将第 7 行代码的注释去掉再运行,我们就可以得到以下输出结果:
从结果上看,方法 interrupted() 的确判断出了当前线程(此例为 main 线程)是否是停止状态了,但为什么第二个布尔值为 false 呢?我们在最开始的时候有说过——interrupted() 测试当前线程是否已经是中断状态,执行后会将状态标志清除。
因为执行 interrupted() 后它会将状态标志清除,底层调用了 isInterrupted(true),此处参数为 true 。所以 interrupted() 具有清除状态标记功能。
在第一次调用时,由于此前执行了 Thread.currentThread().interrupt();,导致当前线程被标记了一个中断标记,因此第一次调用 interrupted() 时返回 true。因为 interrupted() 具有清除状态标记功能,所以在第二次调用 interrupted() 方法时会返回 false。
以上就是 interrupted() 的介绍内容,最后我们再来看下 isInterrupted() 方法吧。
isInterrupted() 和 interrupted() 有两点不同:一是不具有清除状态标记功能,因为底层传入 isInterrupted() 方法的参数为 false。二是它判断的线程调用该方法的对象所表示的线程,本例为 MyThread01 对象。
我们修改一下上面的代码,看下运行效果:
@Test
public void test() {
try {
MyThread01 myThread = new MyThread01();
myThread.start();
myThread.sleep(1000);
myThread.interrupt();
// 修改了下面这两行。
// 上面的代码是 myThread.interrupted();
System.out.println("是否中断1 " + myThread.isInterrupted());
System.out.println("是否中断2 " + myThread.isInterrupted());
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("main end");
}
输出结果:
结果很明显,因为 isInterrupted() 不具有清除状态标记功能,所以两次都输出 true。
参考文章:http://www.cnblogs.com/hapjin/p/5450121.html
interrupt(),interrupted() 和 isInterrupted() 的区别的更多相关文章
- java中interrupt,interrupted和isInterrupted的区别
文章目录 isInterrupted interrupted interrupt java中interrupt,interrupted和isInterrupted的区别 前面的文章我们讲到了调用int ...
- interrupt ,interrupted 和 isInterrupted
1.interrupt interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监 ...
- java---interrupt、interrupted和isInterrupted的区别
1.interrupt() interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己 ...
- 【JAVA多线程】interrupted() 和 isInterrupted() 的区别
Thread 类中提供了两种方法用来判断线程的状态是不是停止的.就是我们今天的两位主人公 interrupted() 和 isInterrupted() . interrupted() 官方解释:测试 ...
- interrupt和interrupted和isInterrupted的区别
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11413917.html interrupt Code Demo package org.fool.th ...
- interrupt interrupted isInterrupted 方法对比、区别与联系 多线程中篇(八)
interrupt interrupted isInterrupted 是三个“长相”非常类似的方法. 本文将对这三个方法简单的对比下,首先了解下线程停止的方式 线程停止方式 在Java中如果想停止一 ...
- JAVA多线程之中断机制(stop()、interrupted()、isInterrupted())
一,介绍 本文记录JAVA多线程中的中断机制的一些知识点.主要是stop方法.interrupted()与isInterrupted()方法的区别,并从源代码的实现上进行简单分析. JAVA中有3种方 ...
- interrupted()和isInterrupted()比较+终止线程的正确方法+暂停线程
interrupted():测试当前线程[运行此方法的当前线程]是否已经是中断状态,执行后具有将状态标志清除为false的功能. isInterrupted():测试线程对象是否已经是中断状态,但不清 ...
- java线程interrupt、interrupted 、isInterrupted区别
前言 在分析interrupt之前,应该先了解java里线程有5种状态,其中有一个阻塞状态,interrupt和阻塞有关. interrupt() 方法 作用于要中断的那个线程. interrupt( ...
随机推荐
- 解压命令tar zxvf中zxvf分别是什么意思
x : 从 tar 包中把文件提取出来z : 表示 tar 包是被 gzip 压缩过的,所以解压时需要用 gunzip 解压v : 显示详细信息f xxx.tar.gz : 指定被处理的文件是 xxx ...
- DNS域名解析之分离解析
分离解析配置 1.为网关服务器配置双网卡 , 在关机状态下再添加一块网卡,重启系统 ifconfig ens36 12.0.0.1/24 ifconfig 2.安装bind软件包 yum instal ...
- 添加了tabBar之后就不能使用wx.navigateTo跳转页面
我在app.json中添加了增加底部选项卡的代码如下: { "pages": [ "pages/index/index", "pages/lo ...
- 流量录制与回放在vivo的落地实践
一.为什么要使用流量录制与回放? 1.1 vivo业务状况 近几年,vivo互联网领域处于高速发展状态,同时由于vivo手机出货量一直在国内名列前茅,经过多年积累,用户规模非常庞大.因此,vivo手机 ...
- 在公司内部网络如何搭建Python+selenium自动化测试环境
在公司内部安装Python+selenium测试环境,由于不能连外网所以不能使用pip命令进行安装,经过多次尝试终于安装成功,现总结如下分享给大家,也希望跟大家一起学习和交流自动化网页测试时遇到的问题 ...
- PyCharm编程软件详细安装教程
PyCharm编程软件安装教程&破解 一.官网下载软件 1. 网页搜索进入PyCharm官网下载页面(https://www.jetbrains.com/pycharm/download/ ) ...
- ReentrantLock与synchronized比较分析
ReentrantLock:完成了Lock接口,是一个可重入锁,并且支持线程公正竞赛和非公正竞赛两种形式,默认情况下对错公正形式.ReentrantLock算是synchronized的补充和替代计划 ...
- MySQL高级优化
MySQL高级 1.索引是什么? (1)索引是排好序可以快速查找的数据结构 (2)方便快速查找,索引实际上也是一张表所以也是要占内存的 2.索引存在哪里? (1)InnoDB引擎 ①索引是和数据存放在 ...
- k8s家族Pod辅助小能手Init容器认知答疑?
k8s家族Pod辅助小能手Init容器认知答疑? k8s集群Init 容器是一种特殊容器,职责是在Pod的生命周期中作为应用容器的前置启动容器. 在很多应用场景中,在 Pod 内的应用容器正式启动之前 ...
- 教你如何使用flask实现ajax数据入库
摘要:在正式编写前需要了解一下如何在 python 函数中去判断,一个请求是 get 还是 post. 本文分享自华为云社区<[首发]flask 实现ajax 数据入库,并掌握文件上传>, ...