为什么在当前线程运行时中断它?

时间:2014-05-13 14:03:53

标签: java multithreading synchronization

我正在学习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());
    }
}

3 个答案:

答案 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()会返回并清除线程中断标志;代码只是在最后重置标志;基本上推迟了一段时间的线程中断。