LockSupport parkUntil with blocker

LockSupport parkUntil with blocker

我试图了解方法参数的用途:LockSupport::parkUntil。让我举个例子来说明我的意思:

public static void main(String[] args) {

    Object blockedOn = new Object();
    System.out.println(blockedOn.hashCode());

    Thread parked = new Thread(() -> {
        System.out.println("parking the thread");

        long howMuch = System.currentTimeMillis() + 5 * 1000;

        while (System.currentTimeMillis() < howMuch) {
            LockSupport.parkUntil(blockedOn, howMuch);
        }

        System.out.println("parked the thread");
    });

    parked.start();
    sleepOneSecond();

    Object on = LockSupport.getBlocker(parked);
    System.out.println(on.hashCode());

}

private static void sleepOneSecond() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}

实际上有几个问题,如果有人想帮助我理解这一点。首先,是 while loop,我没有看到任何其他方法可以摆脱(来自 LockSupport::parkUntil 的文档):

The call spuriously (that is, for no reason) returns.

所以,我只能假设 LockSupport::parkUntil 会无缘无故地失败;因此,我不得不将其包装成一个循环。

我的下一个问题是 blockedOn 参数的用途是什么?我确实明白,当等待足够长的时间时,我可以这样做:

Object on = LockSupport.getBlocker(parked);

即:找出我被阻止的对象的 当前 状态,因此,以某种方式对此做出反应。我想我可以中断阻塞的线程(当然它必须支持中断),但是还有其他原因吗?

对于您的第一个问题,此循环与您用于 Condition 的循环相同,确保在您退出 "parked" 模式时仍满足 "state predicate"。

关于您的第二个问题,blocker 对象实际上仅用于调试目的。 Javadoc states

The three forms of park each also support a blocker object parameter. This object is recorded while the thread is blocked to permit monitoring and diagnostic tools to identify the reasons that threads are blocked.

请注意,unpark 方法不需要 blocker 对象,这表明它不用作停车机制的一部分(即与许可证无关)。事实上,您可以使用同一个 blocker 对象停放多个线程。