Понимание java.lang.Thread.State: WAITING (парковка)

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

Во-вторых, посмотрев метод парковки в API-интерфейс java thread

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

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

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

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

Спасибо

Ответ 1

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

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

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

Ответ 2

В соответствии с java Документация состояния потока, поток может перейти в состояние WAITING по трем причинам:

  • Object.wait без тайм-аута
  • Thread.join без тайм-аута
  • LockSupport.park

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

Итак, когда ваш поток находится в режиме ожидания, LockSupport.park, он покажет вам, как WAITING (парковка).

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

Ответ 3

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

Этот класс ассоциируется с каждым используемым им потоком, разрешает (в смысле класса Семафор). Призыв к парковке немедленно возвращается, если разрешение доступно, потребляя [разрешение] в процессе; иначе [вызов парковки] может блокироваться. Призыв к unpark делает доступным разрешение, если оно еще не доступно. (В отличие от Семафоров, однако, разрешения не накапливаются. Существует не более одного.)

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

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

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

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

Ответ 4

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

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

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