我试图了解方法的参数的用途: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/