java - LockSupport parkUntil 带阻挡器

标签 java java-8 concurrency locking

我试图了解方法的参数的用途: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 循环,我没有看到任何其他方法可以摆脱(LockSupport::parkUntil 的文档):

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

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

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

Object on = LockSupport.getBlocker(parked);

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

最佳答案

对于你的第一个问题,这个循环与你用于 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 对象,这表明它不用作 parking 机制的一部分(即与许可证无关)。事实上,您可以使用同一个 blocker 对象来停放多个线程。

关于java - LockSupport parkUntil 带阻挡器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61016072/

相关文章:

go - 根据key向特定go routine发送消息

firebase - 如何增加Firebase数据库读取时间并防止Nginx超时

java - 从游戏板上获取最后一步

java - 迭代按比较器排序的树形图

java - java 8中有 "instanceof "的替换吗?

java - 不兼容的类型,发现 List<capture<?仅在 Java 8 中扩展模型>>

java - 介于 LinkedList 和 ArrayList 之间

java - CXF RESTful 客户端 - 如何信任所有证书?

java - Ant 构建以包含 lib 子目录中的 jar

javascript - 说 Node.js 和 JavaScript 提供基于事件循环的并发模型是不正确的吗?