我刚刚经过Javadoc for interrupts。我确实得到了Thread类的两个方法之间的区别:interrupted()和isInterrupted()。引用文档:
当线程通过调用静态方法检查中断时 Thread.interrupted,中断状态被清除。非静态的 isInterrupted方法,由一个线程用于查询 另一个中断状态,不改变中断状态 标志。
我没有得到的是为什么这种行为确实如此?
有interrupted
重置当前线程状态的原因是什么原因isInterrupted
没有调用它的线程?
答案 0 :(得分:3)
Thread.interrupted
仅适用于当前线程;这是一种静态方法。
new Thread(() -> {
while (true) {
if (Thread.interrupted()) {
break;
}
System.out.println("Running");
}
});
清除标志很方便,因为执行检查的线程会对中断做出反应并以某种方式处理它。如果您想再次重置标志,那很简单:只需拨打interrupt
。
isInterrupted
不是静态方法。它的设计可能被其他线程调用。
Thread foo = new Thread(/*...*/);
foo.start();
//...
if (foo.isInterrupted())
{
//do something
}
首先,其他线程在概念上不应该告诉foo
它不再被中断。 foo
必须自行处理中断 - 其他线程无法代表foo
执行此操作。
从实现的角度来看,如果此方法要自动清除该标志,则必须将此check-then-reset设置为原子,以避免线程foo
在重置之前读取该标志。你必须以某种方式与线程本身共享这个互斥锁。这会使isInterrupted
方法难以置信地使用。
答案 1 :(得分:0)
如果要检查线程是否已被中断,请致电thread.isInterrupted()
。
当你想检查当前线程是否被中断时,如果是,你将处理&吞下它,拨打Thread.interrupted()