Во-первых, действительно тупой вопрос, мне просто интересно, что означает ожидание «парковка»? Ожидает ли поток, чтобы его припарковали, или он просто припаркован и поэтому находится в состоянии ожидания? И когда эта парковка произойдет, сколько ресурсов процессора / памяти будет занято? Какова цель парковки потока?
Во-вторых, взглянув на метод park в API потока Java
Отключает текущий поток для целей планирования потоков, если разрешение не доступно.
Если разрешение доступно, оно потребляется, и вызов немедленно возвращается; в противном случае текущий поток будет отключен для целей планирования потоков и будет бездействовать, пока не произойдет одно из трех ...
Английский не является моим основным языком, поэтому у меня есть некоторые трудности с пониманием этого, я имел в виду «разрешение» как своего рода «разрешение на парковку темы», поэтому следующие вопросы:
- что это означает, что такое «разрешение», и кто и как проверяет это разрешение?
- Что это значит: «если разрешение есть, значит, оно израсходовано», «припарковано»?
- Далее, если второй пункт верен, то в чем разница между «парковкой» и «бездействием»? Если у меня есть разрешение, я могу оставить его навсегда, а если нет, я могу сделать его «неактивным»?
благодаря
источник
park()
означает: «Я хочу приостановить выполнение, пока какой-либо другой поток не даст мне разрешение путем вызоваunpark()
».Согласно документации состояния потока Java , поток может перейти в состояние WAITING по трем причинам:
Когда вы вызываете метод парковки в потоке, он отключает поток для целей планирования потоков, если разрешение не доступно. Вы можете вызвать метод unpark, чтобы сделать доступным разрешение для данного потока, если оно еще не было доступно.
Итак, когда ваш поток находится в режиме WAITING от LockSupport.park, он будет отображаться как WAITING (парковка).
Обратите внимание, что вы можете вызывать парковку только в текущем потоке. Это очень полезный механизм для реализации шаблона проектирования производитель-потребитель.
источник
Из описания класса (вверху javadoc LockSupport ), где описывается разрешение:
(Я расширил [текст], чтобы его было легче читать для не говорящих по-английски.)
Надеюсь, кто-нибудь с более глубоким пониманием сможет подробнее рассказать об этом.См. Ответ axtavt.В качестве последнего примечания, последняя цитата из javadoc:
источник
Часть, которая заставила меня вернуться к этому вопросу, который я не мог обойти, читая документацию, была:
Итак, когда разрешение «доступно», кто и как делает его доступным, чтобы его можно было использовать немедленно? Это было как-то тривиально выяснить:
public static void main(String[] args) { Thread parkingThread = new Thread(() -> { System.out.println("Will go to sleep..."); sleepTwoSeconds(); System.out.println("Parking..."); // this call will return immediately since we have called LockSupport::unpark // before this method is getting called, making the permit available LockSupport.park(); System.out.println("After parking..."); }); parkingThread.start(); // hopefully this 1 second is enough for "parkingThread" to start // _before_ we call un-park sleepOneSecond(); System.out.println("Un-parking..."); // making the permit available while the thread is running and has not yet // taken this permit, thus "LockSupport.park" will return immediately LockSupport.unpark(parkingThread); } private static void sleepTwoSeconds() { try { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } } private static void sleepOneSecond() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
Код говорит сам за себя,
thread
он запущен, но еще не вызванLockSupport.park
, в то время как какой-то другой поток вызываетLockSupport.unpark
его, что делает разрешение доступным. После этого мы звоним,LockSupport.park
и он сразу же возвращается, так как разрешение доступно.Если подумать, это немного опасно, если вы открываете свои потоки некоторому коду, который вы не контролируете, и этот код вызывает,
LockSupport.unpark
пока выpark
после этого - это может не сработать.источник
Насколько я понимаю, «разрешение» - это просто объект, который представляет, может ли поток быть «незапаркованным» или нет. И это проверяется самим потоком (или de JRE, когда вы пытаетесь припарковать поток). «Потребляется», я понимаю, что разрешение исчезает, и поток не отключается.
Я думаю, вам следует узнать немного больше о многопоточности ... Думайте об этом как о распределителе с объектами под названием «разрешение». Вы говорите потоку запарковаться, а поток проверяет дозатор, если есть «разрешение», поток берет его и уходит (без парковки). Если в дозаторе нет «разрешения», поток остается на стоянке до тех пор, пока «разрешение» не станет доступным (и вы можете поместить «разрешение» в дозатор с помощью
unpark
.Что касается использования ЦП / памяти, я думаю, это зависит от ОС и т. Д.
источник