Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带锁止器的锁支架_Java_Java 8_Concurrency_Locking - Fatal编程技术网

Java 带锁止器的锁支架

Java 带锁止器的锁支架,java,java-8,concurrency,locking,Java,Java 8,Concurrency,Locking,我试图理解方法:LockSupport::parkintil参数的用途。让我举一个例子来说明我的意思: public static void main(String[] args) { Object blockedOn = new Object(); System.out.println(blockedOn.hashCode()); Thread parked = new Thread(() -> { System.out.println("pa

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

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);
    }
}

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

对于您的第一个问题,这个循环与您在a中使用的循环相同,确保退出“停驻”模式时“状态谓词”仍然得到满足

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

三种形式的park也都支持blocker对象参数。 当线程被阻塞以允许时,记录此对象 使用监视和诊断工具来确定线程中断的原因 你被封锁了


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

一个简单的例子是执行内置线程转储(Windows上的CTRL+BRK),您将在jdk.internal.misc.Unsafe.park(java)上看到类似
java.lang.thread.State:TIMED_WAITING(parking))。base@11/本机方法)-停车等待(java.util.concurrent.locks.LockSupport.parkintil(java。base@11/LockSupport.java:275)
Object on = LockSupport.getBlocker(parked);