LockSupport parkUntil с блокировщиком - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь понять, для чего нужен параметр параметра: 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 объекта, на котором я заблокирован, и, таким образом, как-то реагировать на который. Я думал, что смогу прервать заблокированный поток (конечно, он должен поддерживать прерывания), но может ли быть какая-то другая причина?

1 Ответ

1 голос
/ 07 апреля 2020

Для вашего первого вопроса это l oop - это то же самое, что вы использовали бы для Condition, гарантируя, что «предикат состояния» все еще удовлетворен, когда вы выходите из «припаркованного» режима .

Что касается вашего второго вопроса, объект blocker действительно используется только для целей отладки. Состояния Javado c

Каждая из трех форм парковки также поддерживает параметр объекта-блокиратора. Этот объект записывается, когда поток заблокирован, чтобы позволить инструментам мониторинга и диагностики c определить причины блокировки потоков.

Обратите внимание, что метод unpark делает не нужен объект blocker, что означает, что он не используется как часть механизма парковки (ie. не имеет отношения к разрешению). Фактически, вы можете парковать несколько потоков с одним и тем же объектом blocker.

...