Я пытаюсь понять, для чего нужен параметр параметра: 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 loop
, я не вижу никаких других способов уйти (документация от LockSupport::parkUntil
):
Вызов ложно (то есть без причины) возвращается.
Итак, я могу только предположить, что LockSupport::parkUntil
может потерпеть неудачу без причины; как таковой, я вынужден обернуть это в al oop.
Следующий вопрос, который у меня есть, - какова цель этого параметра blockedOn
? Я понимаю, что, ожидая достаточно долго, я мог бы сделать:
Object on = LockSupport.getBlocker(parked);
, то есть: узнать состояние current объекта, на котором я заблокирован, и, таким образом, как-то реагировать на который. Я думал, что смогу прервать заблокированный поток (конечно, он должен поддерживать прерывания), но может ли быть какая-то другая причина?