Java 为什么被打断和被打断的行为方式不同?
我刚刚经历过。我确实了解了Thread类的两个方法之间的区别:interrupted()和isInterrupted()。引用该文件: 当线程通过调用静态方法检查中断时 Thread.interrupted,中断状态被清除。非静态 isInterrupted方法,由一个线程用于查询 另一个的中断状态,不改变中断状态 旗帜 我不明白的是,为什么这种行为一直如此?Java 为什么被打断和被打断的行为方式不同?,java,multithreading,Java,Multithreading,我刚刚经历过。我确实了解了Thread类的两个方法之间的区别:interrupted()和isInterrupted()。引用该文件: 当线程通过调用静态方法检查中断时 Thread.interrupted,中断状态被清除。非静态 isInterrupted方法,由一个线程用于查询 另一个的中断状态,不改变中断状态 旗帜 我不明白的是,为什么这种行为一直如此? 是否有任何原因导致interrupted重置当前线程的状态,而isInterrupted没有调用它的线程的状态?线程。interrupt
是否有任何原因导致
interrupted
重置当前线程的状态,而isInterrupted
没有调用它的线程的状态?线程。interrupted
仅适用于当前线程;这是一种静态方法
new Thread(() -> {
while (true) {
if (Thread.interrupted()) {
break;
}
System.out.println("Running");
}
});
清除标志很方便,因为执行检查的线程预期会对中断做出反应并以某种方式处理它。如果要再次重置标志,很简单:只需调用中断
isInterrupted
不是静态方法。它被设计成可能被其他线程调用
Thread foo = new Thread(/*...*/);
foo.start();
//...
if (foo.isInterrupted())
{
//do something
}
首先,其他线程在概念上不能告诉foo
它不再被中断foo
必须自己处理中断-其他线程不能代表foo
处理中断
从实现的角度来看,如果此方法要自动清除标志,那么必须将此检查设置为原子,以避免线程
foo
在重置标志之前读取标志。您必须以某种方式与线程本身共享这个互斥锁。这将使isInterrupted
方法难以使用。如果要检查线程是否已中断,请调用thread.isInterrupted()
当您要检查当前线程是否中断时,如果是,您将处理并吞下它,请调用thread.interrupted()