首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带阻滞剂的LockSupport parkUntil

带阻滞剂的LockSupport parkUntil
EN

Stack Overflow用户
提问于 2020-04-03 16:13:53
回答 1查看 256关注 0票数 2

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

代码语言:javascript
复制
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的文档):

虚假调用(即,无缘无故)返回。

因此,我只能假设LockSupport::parkUntil可以毫无原因地失败;因此,我不得不将其包装到一个循环中。

下一个问题是,blockedOn参数的用途是什么?我明白,等得够久,我可以:

代码语言:javascript
复制
Object on = LockSupport.getBlocker(parked);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-07 15:53:12

对于第一个问题,此循环与Condition使用的循环相同,确保在退出“停放”模式时“状态谓词”仍然满足。

至于第二个问题,blocker对象实际上只用于调试目的。The Javadoc状态

这三种类型的park都支持一个阻止程序对象参数。当线程被阻塞时记录此对象,以允许监视和诊断工具识别线程被阻塞的原因。

注意,unpark方法不需要blocker对象,这意味着它没有被用作停车机制的一部分(即。与许可证无关)。实际上,您可以使用同一个blocker对象存储多个线程。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61016072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档