Понимание java.ленг.Нитка.Состояние: ожидание (парковка)


во-первых, действительно глупый вопрос, мне просто интересно, что означает ожидание "парковка"? Поток ждет, чтобы быть припаркованным или он просто был припаркован и поэтому находится в состоянии ожидания ? И когда эта парковка происходит, сколько ресурсов процессора / памяти берется ? Какова цель парковки потока ?

во-вторых, глядя на парк метод в JAVA thread API

отключает текущий поток в целях планирования потоков, если разрешение имеющийся.

Если разрешение отсутствует, то оно используется, и вызов возвращается немедленно; в противном случае текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из трех вещей не происходит.....

английский не является моим основным языком, поэтому у меня есть некоторые трудности с пониманием того, что я намеревался "разрешить" как своего рода "разрешение на парковку потока", поэтому следующие вопросы:

  • что смысл этого, что такое "разрешение", и кто и как проверяет эти разрешения ?
  • что это значит: "если разрешение доступно, то оно потребляется", оно становится "припаркованным"?
  • следуя, если второй пункт верен, так в чем же разница между "парковка" и "лежит в спячке"? Если у меня есть разрешение, я могу оставить его навсегда, а если нет, я могу сделать его "спящим"?

спасибо

5 72

5 ответов:

разрешение означает разрешение на продолжение выполнения. Парковка означает приостановку исполнения до получения разрешения.

в отличие от SemaphoreС разрешения LockSupport связаны с потоками (т. е. разрешение дается конкретному потоку) и не накапливается (т. е. может быть только одно разрешение на поток, когда поток потребляет разрешение, оно исчезает).

вы можете дать разрешение на поток путем вызова unpark(). Поток может приостановить свое выполнение пока разрешение не будет доступно (или поток прерван, или тайм-аут истек и т. д.), вызывая park(). Когда разрешение доступно, припаркованный поток потребляет его и выходит из park() метод.

согласно java Документация Состояния Потока поток может перейти в состояние ожидания по трем причинам:

    из описания класса (в верхней части LockSupport javadoc), где он описывает разрешение:

    этот класс связывается с каждым потоком, который его использует, a разрешение (в смысле класса Semaphore). Звонок в парк вернется немедленно, если разрешение доступно, потребляя [разрешение] в процессе; в противном случае [звонок в парк] могут заблокировать. Вызов unpark делает разрешение имеется, если оно не было уже доступно. (В отличие от семафоров, хотя, разрешения не накапливаются. Есть самое большее один.)

    (Я расширил [текст] чтобы сделать его более удобным для чтения для говорящих на английском языке.)

    надеюсь, кто-то с более глубоким пониманием могут говорить об этом. см. ответ axtavt.

    в качестве заключительной ноты, последняя цитата из javadoc:

    эти методы предназначены для использования в качестве средства создание утилит синхронизации более высокого уровня и сами по себе не являются полезными для большинства приложений управления параллелизмом.

    часть, которая заставила меня вернуться к этому вопросу, который я не мог обойти, только читая документацию, была такой:

    если разрешение доступно, то оно потребляется и вызов возвращается немедленно...

    Итак, как разрешение "доступно", кто и как делает его доступным, чтобы он мог быть немедленно потреблен? Это было как-то тривиально, чтобы узнать:

    private static void sleep(long howMuch) {
        try {
            Thread.sleep(howMuch);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
    
        Thread t = new Thread(() -> {
            System.out.println("Sleeping...");
            sleep(2000);
            System.out.println("Parking");
            LockSupport.park();
            System.out.println("After parking");
        });
    
        sleep(1000);
        t.start();
        System.out.println("Unparking");
        // making the permit available while the thread is running and has not yet
        // taken this permit, thus "LockSupport.park" will return immediately
        LockSupport.unpark(t);
    
    }
    

    код говорит сам за себя, то thread работает , но не под названием LockSupport.park, в то время как некоторые другие вызовы потока LockSupport.unpark на то, что разрешение имеется. После этого мы называем LockSupport.park и это возвращается немедленно, так как разрешение доступно.

    как только вы подумаете об этом, это немного опасно, если вы подвергаете свои потоки некоторому коду, который вы не контролируете, и этот код вызывает LockSupport.unpark а вы park после этого - это может не сработать.

    Как я понимаю, "разрешение" - это просто объект, который представляет, Может ли поток быть "unparked" или нет. И это проверяется самим потоком (или de JRE, когда вы пытаетесь припарковать поток) Вещь" потребляется", я понимаю, что разрешение исчезает, и поток не разъединяется.

    Я думаю, вы должны узнать немного больше о многопоточности.. Подумайте об этом как о диспенсере с объектами, называемыми "разрешение". Вы говорите потоку припарковаться, а поток проверьте свой дозатор, если есть "разрешение", нить берет его и уходит(без парка). Если в диспенсере нет "разрешения", поток припаркован до тех пор, пока не будет доступно" разрешение "(и вы можете поместить" разрешение " в диспенсер с unpark.

    Что касается использования процессора/памяти, я думаю, что это зависит от ОС и т. д...