我刚通过用于中断的Javadoc。我确实了解到线程类的两种方法之间的区别:中断()和isInterrupted()。引用医生的话:
当线程通过调用静态方法Thread.interrupted来检查中断时,中断状态将被清除。一个线程用于查询另一个线程的中断状态的非静态isInterrupted方法不会更改中断状态标志。
我不明白的是,为什么会有这样的行为呢?interrupted是否有理由重置当前线程的状态,而isInterrupted没有重新设置调用的线程的状态?
发布于 2018-05-01 13:37:36
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处理它。
从实现的角度来看,如果此方法要自动清除标志,则必须使这种检查然后重置为原子,以避免线程foo在重新设置标志之前读取标志。您将不得不以某种方式与线程本身共享这个互斥体。这将使isInterrupted方法的使用变得非常笨拙。
发布于 2018-05-01 13:54:04
当您想检查线程是否已被中断时,请调用thread.isInterrupted()。
当您想要检查当前线程是否已被中断时,如果是,您将处理并吞下它,调用Thread.interrupted()
https://stackoverflow.com/questions/50117219
复制相似问题