Понимание java.ленг.Нитка.Состояние: ожидание (парковка)
во-первых, действительно глупый вопрос, мне просто интересно, что означает ожидание "парковка"? Поток ждет, чтобы быть припаркованным или он просто был припаркован и поэтому находится в состоянии ожидания ? И когда эта парковка происходит, сколько ресурсов процессора / памяти берется ? Какова цель парковки потока ?
во-вторых, глядя на парк метод в JAVA thread API
отключает текущий поток в целях планирования потоков, если разрешение имеющийся.
Если разрешение отсутствует, то оно используется, и вызов возвращается немедленно; в противном случае текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из трех вещей не происходит.....
английский не является моим основным языком, поэтому у меня есть некоторые трудности с пониманием того, что я намеревался "разрешить" как своего рода "разрешение на парковку потока", поэтому следующие вопросы:
- что смысл этого, что такое "разрешение", и кто и как проверяет эти разрешения ?
- что это значит: "если разрешение доступно, то оно потребляется", оно становится "припаркованным"?
- следуя, если второй пункт верен, так в чем же разница между "парковка" и "лежит в спячке"? Если у меня есть разрешение, я могу оставить его навсегда, а если нет, я могу сделать его "спящим"?
спасибо
5 ответов:
разрешение означает разрешение на продолжение выполнения. Парковка означает приостановку исполнения до получения разрешения.
вы можете дать разрешение на поток путем вызова
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
.Что касается использования процессора/памяти, я думаю, что это зависит от ОС и т. д...