我正在学习java中的锁定机制,并发现了一些代码,这些代码在LockSupport类中作为示例给出,其中线程通过调用interrupt()方法来中断自身。我很困惑,当一个线程已经运行时,为什么它会自行中断。
我还想清除所有人,我知道current thread is interrupted inside the catch block时会发生什么,但我想知道在运行Thread中断时会发生什么。
来自LockSupport 的代码
示例代码在这里
class FIFOMutex {
private final AtomicBoolean locked = new AtomicBoolean(false);
private final Queue<Thread> waiters = new ConcurrentLinkedQueue<Thread>();
public void lock() {
boolean wasInterrupted = false;
Thread current = Thread.currentThread();
waiters.add(current);
// Block while not first in queue or cannot acquire lock
while (waiters.peek() != current || !locked.compareAndSet(false, true)) {
LockSupport.park(this);
if (Thread.interrupted()) // ignore interrupts while waiting
wasInterrupted = true;
}
waiters.remove();
if (wasInterrupted) // reassert interrupt status on exit
current.interrupt(); // Here it is interrupting the currentThread which
}
public void unlock() {
locked.set(false);
LockSupport.unpark(waiters.peek());
}
}
答案 0 :(得分:2)
我想知道运行Thread中断本身会发生什么。
中断标志设置为true。没有什么能像触发异常或发信号通知线程一样神奇。
如果你打断另一个在可中断方法上被阻塞的线程,这将触发该方法抛出InterruptedException。
致电时
Thread.interrupted()
这会清除该标志,如果您想再次设置它,则需要使用interrupt()
将标志设置为true
,以便其他代码可以检测到该线程被中断。
更简单的解决方案是使用不清除标记的Thread.currentThread().isInterrupted()
。
答案 1 :(得分:1)
这是因为Thread.interrupted()
不仅会检查当前线程上是否设置了中断标志,还会清除它!
因此需要重新启用它。
这里更好的解决方案是使用Thread.currentThread().isInterrupted()
,而不清除中断标志。
是的,只有这样:一面旗帜。你没有发出信号&#34;一个线程,实质上。当你收到一个中断的异常时,这是因为被叫方已经检测到设置了中断标志并抛出了这个异常(或者#34;从下面冒出来#34;)。它并没有自动发生&#34;。
换句话说:在Java中,线程中断是一个合作过程。
答案 2 :(得分:0)
Thread.interrupted()会返回并清除线程中断标志;代码只是在最后重置标志;基本上推迟了一段时间的线程中断。