java.lang.Thread.interrupt()
被调用时的作用吗?#1 楼
Thread.interrupt()
设置目标线程的中断状态/标志。然后在该目标线程中运行的代码可以轮询中断状态并适当地处理它。诸如Object.wait()
之类的某些阻塞方法可能会立即消耗中断状态并抛出适当的异常(通常是InterruptedException
)。Java中的中断不是抢先的。换句话说,两个线程必须配合才能正确处理中断。如果目标线程未轮询中断状态,则中断将被有效忽略。通过
Thread.interrupted()
方法进行轮询,该方法返回当前线程的中断状态并清除该中断标志。通常,线程然后可能会执行诸如throw InterruptedException之类的操作。EDIT(来自Thilo注释):一些API方法已内置中断处理。在我的头上,这包括。
Object.wait()
,Thread.sleep()
和Thread.join()
大多数
java.util.concurrent
结构Java NIO(但不是java.io),并且不使用
InterruptedException
,而是使用ClosedByInterruptException
。线程中断是轻推线程的一种温和方法。与
Thread.stop()
相比,它可以使线程有机会干净地退出,这更像是用突击步枪射击线程。评论
请注意,诸如sleep或wait之类的方法会执行此类轮询,并自行引发InterruptedException。
– Thilo
2010年8月28日在8:17
如果您使用可中断的文件I / O,效果将不会那么温和。通常,您会得到文件损坏。
– Marko Topolnik
16年11月6日在18:01
如果您提到Thread.interrupted,似乎应该提到也有一个Thread.isInterrupted标志,它不会清除该标志,因此通常更适合应用程序开发人员使用。
–内森·休斯(Nathan Hughes)
19年5月24日在20:55
#2 楼
什么是中断?中断是对
线程的指示,它应该停止正在执行的操作并执行其他操作。
程序员可以完全确定
线程如何响应中断,
但是线程
终止是很常见的。
如何实现?
中断机制是使用内部标志(称为中断状态)实现的。调用
Thread.interrupt设置此标志。当
线程通过调用静态方法
Thread.interrupted检查中断时,将清除中断状态。
一个线程用于查询另一个线程的中断状态的非静态
Thread.isInterrupted不会更改
中断状态标志。
Thread.interrupt()
API的引用:中断此线程。首先,调用此线程的
checkAccess方法
,这可能导致引发
SecurityException。
如果此线程在
中被阻塞调用
对象类的wait(),wait(long),
或wait(long,int)方法或join(),
join(long),join的方法(long,int),
sleep(long)或sleep(long,int),
此类的方法,则将清除其
中断状态,并
接收到
InterruptedException。
如果该线程在可中断的
通道上被I / O
操作阻塞,则该通道将被关闭,将设置线程的中断状态
,并且该线程将
接收到ClosedByInterruptException。
如果此线程在选择器中被阻塞,则该线程的中断
/>状态将被设置,并且将从选择
操作立即返回
,可能具有非零的
val ue,就像选择器的
如果先前的条件都不成立
,则此线程的中断状态
将被设置。
检查出于完全了解相同的目的而使用此方法:
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
评论
这是部分解释。它还会中断可中断的方法。
–user207421
10年8月28日在8:56
@EJP这个问题是关于,什么是Thread.interrupt()方法以及它如何工作。我想我发布的任何链接都可以回答要求的内容。我还是不明白你想要什么?
– Yok
2010年8月28日在9:05
希望您更正部分错误的声明,该声明由标志实现。那只是故事的一部分。对我来说似乎很清楚。
–user207421
10-8-28在10:29
@EJP谢谢。现在我明白了你在说什么。我已经更新了答案,并为方法添加了API文档。这涵盖了我的答案中缺少的可中断方法部分。希望我的答案现在看起来完整了:)。
– Yok
10年8月28日在11:14
#3 楼
如果目标线程一直在等待(通过调用wait()
或本质上做相同事情的其他相关方法,例如sleep()
),它将被中断,这意味着它停止等待正在等待的内容,而接收到InterruptedException 。完全由线程本身(称为
wait()
的代码)决定在这种情况下的处理方法。它不会自动终止线程。有时与终止标志结合使用。中断时,线程可以检查此标志,然后自行关闭。但这又只是一个约定。
评论
9岁,永恒的答案! +1
–snr
19年4月7日在23:49
#4 楼
为了完整起见,除了其他答案外,如果线程在Object.wait(..)
或Thread.sleep(..)
等上被阻塞之前被中断,这等效于在阻塞该方法后立即被中断,如以下示例所示。public class InterruptTest {
public static void main(String[] args) {
Thread.currentThread().interrupt();
printInterrupted(1);
Object o = new Object();
try {
synchronized (o) {
printInterrupted(2);
System.out.printf("A Time %d\n", System.currentTimeMillis());
o.wait(100);
System.out.printf("B Time %d\n", System.currentTimeMillis());
}
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("C Time %d\n", System.currentTimeMillis());
printInterrupted(3);
Thread.currentThread().interrupt();
printInterrupted(4);
try {
System.out.printf("D Time %d\n", System.currentTimeMillis());
Thread.sleep(100);
System.out.printf("E Time %d\n", System.currentTimeMillis());
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("F Time %d\n", System.currentTimeMillis());
printInterrupted(5);
try {
System.out.printf("G Time %d\n", System.currentTimeMillis());
Thread.sleep(100);
System.out.printf("H Time %d\n", System.currentTimeMillis());
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("I Time %d\n", System.currentTimeMillis());
}
static void printInterrupted(int n) {
System.out.printf("(%d) Am I interrupted? %s\n", n,
Thread.currentThread().isInterrupted() ? "Yes" : "No");
}
}
输出:
$ javac InterruptTest.java
$ java -classpath "." InterruptTest
(1) Am I interrupted? Yes
(2) Am I interrupted? Yes
A Time 1399207408543
WAS interrupted
C Time 1399207408543
(3) Am I interrupted? No
(4) Am I interrupted? Yes
D Time 1399207408544
WAS interrupted
F Time 1399207408544
(5) Am I interrupted? No
G Time 1399207408545
H Time 1399207408668
I Time 1399207408669
含义:如果您像下面这样循环,则中断发生在控制权的确切时刻已经离开了
Thread.sleep(..)
并正在循环,异常仍然会发生。因此,完全可靠地依靠在线程被中断之后可靠地引发InterruptedException即可:while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException ie) {
break;
}
}
#5 楼
线程中断基于标志中断状态。对于每个线程,中断状态的默认值均设置为false。
每当在线程上调用interrupt()方法时,中断状态都将设置为true。
如果中断状态= true(线程上已经调用了interrupt()),则
该特定线程无法进入睡眠状态。如果在该线程上调用sleep,则会引发中断的异常。在再次引发异常之后,将标志设置为false。
如果线程已经处于睡眠状态,并且调用了interrupt(),则线程将退出睡眠状态并引发中断的Exception。
#6 楼
Thread.interrupt()
将目标线程的中断状态/标志设置为true,这在使用Thread.interrupted()
进行检查时可以帮助停止循环线程。请参阅http://www.yegor256.com/2015/10/20/interrupted-exception.html #7 楼
public void interrupt()中断此线程。
除非当前线程一直在中断自身(始终允许),否则将调用此线程的checkAccess方法,这可能导致
如果调用Object类的wait(),wait(long)或wait(long,int)方法或联接时阻塞此线程,则抛出此异常。此类的方法(),join(long),join(long),sleep(long)或sleep(long,int),则将清除其中断状态,并将收到InterruptedException。 >
如果此线程在可中断的通道上被I / O操作阻塞,则该通道将被关闭,线程的中断状态将被设置,并且该线程将收到ClosedByInterruptException。
如果此线程在选择器中被阻塞,则该线程的中断状态将被设置,并且它将立即从选择操作中返回,可能具有非零值,就像选择
如果先前的条件均不成立,则将设置该线程的中断状态。
中断未运行的线程不需要任何作用。 。
抛出:
SecurityException-如果当前线程无法修改此线程
#8 楼
中断表示线程应停止正在执行的操作并执行其他操作。完全由程序员决定线程如何响应中断,但是线程终止非常常见。很好的参考:https://docs.oracle.com/javase/tutorial/ essential / concurrency / interrupt.html
#9 楼
Thread.interrupt()方法设置内部“中断状态”标志。通常,该标志由Thread.interrupted()方法检查。按照惯例,通过InterruptedException存在的任何方法都必须清除中断状态标志。
评论
您是否有支持“公约”的链接?
– kap
12月18日晚上11:37
是的,我确实有-docs.oracle.com/javase/tutorial/essential/concurrency / ...
– Anatoliy Shuba
12月22日下午5:01
评论
javaspecialists.co.za/archive/Issue056.htmldocs.oracle.com/javase/7/docs/api/java/lang / ...