文档章节

interrupt、interrupted 、isInterrupted 区别

凯奥斯
 凯奥斯
发布于 2013/04/11 00:30
字数 497
阅读 460
收藏 3
点赞 1
评论 4
1、interrupt 
interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。
注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。


2、interrupted 和 isInterrupted

首先看一下该方法的实现:
public static boolean interrupted () {
     return currentThread().isInterrupted(true);
}
该方法就是直接调用当前线程的isInterrupted(true)方法。
然后再来看一下 isInterrupted的实现:
public boolean isInterrupted () {
     return isInterrupted( false);
}

这两个方法有两个主要区别:
  1. interrupted 是作用于当前线程,isInterrupted 是作用于调用该方法的线程对象所对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以在A线程中去调用B线程对象的isInterrupted方法。)
  2. 这两个方法最终都会调用同一个方法,只不过参数一个是true,一个是false;

第二个区别主要体现在调用的方法的参数上,让我们来看一看这个参数是什么含义

先来看一看被调用的方法 isInterrupted(boolean arg)的定义:
private native boolean isInterrupted( boolean ClearInterrupted);
原来这是一个本地方法,看不到源码。不过没关系,通过参数名我们就能知道,这个参数代表是否要清除状态位。

如果这个参数为true,说明返回线程的状态位后,要清掉原来的状态位(恢复成原来情况)。这个参数为false,就是直接返回线程的状态位。

这两个方法很好区分,只有当前线程才能清除自己的中断位(对应interrupted()方法)


© 著作权归作者所有

共有 人打赏支持
凯奥斯
粉丝 45
博文 51
码字总数 41388
作品 0
朝阳
程序员
加载中

评论(4)

凯奥斯
凯奥斯

引用来自“eonezhang”的评论

interrupted这个方法在没有被中断的时候就一直返回false对吧。
如果线程在运行过程中被其他线程中断了,
比如:
Thread a = new MyThread();
a.start();
//中断线程
a.interrupt();

这样a在在sleep的时候就会被中断,然后抛出中断异常,在cache块中调用了interrupt方法是不是就把中断标志给清除了呢,那回到循环开始再调用interrupted的话,一直都返回false吗?这个地方有点绕。

public void run() {
while (!Thread.interrupted()) {
try {
Thread.sleep(interval);
updateTimestamp();
} catch(InterruptedException e){
Thread.currentThread().interrupt();
}
}
}

这分两种情况:1、如果线程是在sleep时被中断:捕获到终端异常后,当前的中断标志位是被清楚的。此时的中断标志是false。但在catch语句中再次调用interrupt后,中断标志位又被置为true。所以Thread.interrupted()第一次返回true,因为此时的标志位就是为true,调用完该方法后,当前线程的标志位又被该方法置成了false(清除了),但此时已经退出循环了,不会产生无限循环。
2、如果线程是在sleep之后被中断的,此时是捕获不到中断异常的。所以在while判断的时候,中断异常还是保持者ture。所以第一次调用时Thread.interrupted()还是返回true,然后退出循环。也不会陷入无限循环中。
eonezhang
eonezhang
interrupted这个方法在没有被中断的时候就一直返回false对吧。
如果线程在运行过程中被其他线程中断了,
比如:
Thread a = new MyThread();
a.start();
//中断线程
a.interrupt();

这样a在在sleep的时候就会被中断,然后抛出中断异常,在cache块中调用了interrupt方法是不是就把中断标志给清除了呢,那回到循环开始再调用interrupted的话,一直都返回false吗?这个地方有点绕。

public void run() {
while (!Thread.interrupted()) {
try {
Thread.sleep(interval);
updateTimestamp();
} catch(InterruptedException e){
Thread.currentThread().interrupt();
}
}
}
凯奥斯
凯奥斯

引用来自“eonezhang”的评论

是不是这样理解呢,
Thread.currentThread().interrupt(); 这个用于清除中断状态,这样下次调用Thread.interrupted()方法时就会一直返回为true,因为中断标志已经被恢复了。
而调用isInterrupted 只是简单的查询中断状态,不会对状态进行修改。

interrupt()是用来设置中断状态的。返回true说明中断状态被设置了而不是被清除了。我们调用sleep、wait等此类可中断(throw InterruptedException)方法时,一旦方法抛出InterruptedException,当前调用该方法的线程的中断状态就会被jvm自动清除了,就是说我们调用该线程的isInterrupted 方法时是返回false。如果你想保持中断状态,可以再次调用interrupt方法设置中断状态。这样做的原因是,java的中断并不是真正的中断线程,而只设置标志位(中断位)来通知用户。如果你捕获到中断异常,说明当前线程已经被中断,不需要继续保持中断位。
interrupted是静态方法,返回的是当前线程的中断状态。例如,如果当前线程被中断(没有抛出中断异常,否则中断状态就会被清除),你调用interrupted方法,第一次会返回true。然后,当前线程的中断状态被方法内部清除了。第二次调用时就会返回false。如果你刚开始一直调用isInterrupted,则会一直返回true,除非中间线程的中断状态被其他操作清除了。
eonezhang
eonezhang
是不是这样理解呢,
Thread.currentThread().interrupt(); 这个用于清除中断状态,这样下次调用Thread.interrupted()方法时就会一直返回为true,因为中断标志已经被恢复了。
而调用isInterrupted 只是简单的查询中断状态,不会对状态进行修改。
interrupt、interrupted和isInterrupted的区别

1.interrupt() interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是改变线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态位并做出...

激情的狼王丶21
2017/12/19
0
0
interrupt、interrupted 、isInterrupted 区别

1、interrupt interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理...

凯奥斯
2013/04/07
0
1
对Java中interrupt、interrupted和isInterrupted的理解

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

摆渡者
2016/11/13
552
2
Java 多线程:Lock接口(接口方法分析,ReentrantLock,ReadWriteLock

前言 *** 当我们了解了多线程生成的原因之后,会有相应的解决办法,最典型的就是 synchronized 和 lock。lock可以说是 synchronized 的一个替代品,synchronized 能做的事,lock 基本都可以做...

icanos
2016/07/21
3
0
java多线程中的interrupt方法的使用

在java中,开启一个多线程是很简单的,只需要new一个runnable就可以了,但是要停止一个线程,却不能简单的使用Thread.stop()方法。 首先来说说java中的中断机制,Java中断机制是一种协作机制...

summerpxy
2014/02/11
4.9K
3
interrupt ,interrupted,isInterrupted 区别

1、interrupt interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理...

zheng_pat
2016/06/13
32
0
理解interrupt

Thread有三个方法: interrupt //线程被标识为停止状态,但是线程还是会继续运行 2.isInterrupted //如果某个线程被标识为停止状态,那么就返回true,否则false。线程停止结果也是false 3.int...

Canaan_
2016/04/28
46
0
java interrupted与isInterrupted方法

interrupted:测试当前线程是否是中断状态,执行完清除中断状态 isInterrupted:测试Thread对象是否是中断状态,不清除中断状态 public static boolean interrupted() { return currentThre...

hgqxjj
2017/12/17
0
0
线程的正确停止

线程停止的几种方式: 线程运行完成,正常停止 执行stop方法,暴力停止,现已弃用 执行interrupt方法,现在使用。 stop方法为什么被弃用? 使用stop方法终止线程会释放掉此线程锁定的所有的监...

LoveOne
2015/12/03
86
0
java 线程isInterrupted 和 interrupted的区别和联系

1、interruptinterrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。...

zheng_pat
2015/06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
21分钟前
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
49分钟前
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
51分钟前
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
55分钟前
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
56分钟前
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0
There is no session with id[xxx]

参考网页 https://blog.csdn.net/caimengyuan/article/details/52526765 报错 2018-07-19 23:04:35,330 [http-nio-1008-exec-8] DEBUG [org.apache.shiro.web.servlet.SimpleCookie] - Found......

karma123
昨天
0
0
vue-router懒加载

1. vue-router懒加载定义 当路由被访问的时候才加载对应组件 2. vue-router懒加载作用 当构建的项目比较大的时候,懒加载可以分割代码块,提高页面的初始加载效率。 ###3. vue-router懒加载实...

不负好时光
昨天
1
0
SpringBoot | 第七章:过滤器、监听器、拦截器

前言 在实际开发过程中,经常会碰见一些比如系统启动初始化信息、统计在线人数、在线用户数、过滤敏高词汇、访问权限控制(URL级别)等业务需求。这些对于业务来说一般上是无关的,业务方是无需...

oKong
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部