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