Po pierwsze, naprawdę głupie pytanie, zastanawiałem się tylko, co oznacza czekanie „parking”? Czy wątek czeka na zaparkowanie, czy właśnie został zaparkowany i dlatego jest w stanie oczekiwania? A kiedy to nastąpi, ile zasobów procesora / pamięci jest pobieranych? Jaki jest cel parkowania wątku?
Po drugie, patrząc na metodę parkowania w interfejsie API wątków Java
Wyłącza bieżący wątek do celów planowania wątków, chyba że zezwolenie jest dostępne.
Jeśli zezwolenie jest dostępne, jest zużywane i wezwanie natychmiast powraca; w przeciwnym razie bieżący wątek zostanie wyłączony do celów planowania wątków i pozostanie w stanie uśpienia, dopóki nie nastąpi jedna z trzech rzeczy .....
Angielski nie jest moim głównym językiem, więc mam pewne trudności ze zrozumieniem tego, zamierzałem „zezwolić” jako rodzaj „pozwolenia na zaparkowanie wątku”, więc następujące pytania:
- jakie jest to znaczenie, co to jest „zezwolenie” i kto i jak sprawdza te zezwolenia?
- Co to znaczy: „jeśli zezwolenie jest dostępne, to jest zużywane”, czy jest „zaparkowane”?
- a następnie, jeśli drugi punkt jest prawdziwy, jaka jest różnica między „parkowaniem” a „uśpionymi kłamstwami”? Jeśli mam pozwolenie, mogę zaparkować go na zawsze, a jeśli nie, mogę go „uśpić”?
Dzięki
źródło
park()
oznacza „Chcę zawiesić moją egzekucję do czasu, aż jakiś inny wątek da mi pozwolenie przez telefonunpark()
”.Zgodnie z dokumentacją stanu wątku java , wątek może przejść do stanu OCZEKIWANIE z trzech powodów:
Gdy wywołujesz metodę parkowania w wątku, wyłącza wątek na potrzeby planowania wątków, chyba że zezwolenie jest dostępne. Możesz wywołać metodę unpark, aby udostępnić zezwolenie dla danego wątku, jeśli nie było jeszcze dostępne.
Tak więc, gdy Twój wątek jest w trybie OCZEKIWANIA przez LockSupport.park, wyświetli się jako OCZEKIWANIE (parking).
Pamiętaj, że możesz zadzwonić do parkowania tylko w bieżącym wątku. Jest to bardzo pomocny mechanizm we wdrażaniu wzorca projektowego producent-konsument.
źródło
Z opisu klasy (na górze LockSupport javadoc ), gdzie opisuje zezwolenie:
(Rozszerzyłem [tekst], aby był łatwiejszy do czytania dla osób nie mówiących po angielsku).
Miejmy nadzieję, że ktoś z głębszym zrozumieniem może to rozwinąć.Zobacz odpowiedź axtavt.Na koniec ostatni cytat z javadoc:
źródło
Część, która sprawiła, że powróciłem do tego pytania, którego nie mogłem obejść podczas czytania dokumentacji, to:
Kiedy więc pozwolenie jest „dostępne”, kto i jak je udostępnia, aby mogło zostać natychmiast wykorzystane? To było w jakiś sposób trywialne, aby się dowiedzieć:
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(); } }
Kod mówi sam za siebie, program
thread
działa, ale jeszcze nie został wywołanyLockSupport.park
, podczas gdy inny wątek go wywołujeLockSupport.unpark
- w ten sposób udostępniając zezwolenie. Po tym dzwonimy,LockSupport.park
a ten wraca natychmiast, ponieważ zezwolenie jest dostępne.Kiedy się nad tym zastanowisz, jest to trochę niebezpieczne, jeśli narażasz swoje wątki na jakiś kod, którego nie kontrolujesz, a ten kod wywołuje,
LockSupport.unpark
gdy typark
potem to robisz - może to nie działać.źródło
Jak rozumiem, „zezwolenie” to po prostu obiekt, który wskazuje, czy wątek można „odparkować”, czy nie. I jest to sprawdzane przez sam Wątek (lub de JRE, gdy próbujesz zaparkować Wątek). „Jest zużyty”, rozumiem, że zezwolenie znika, a Wątek nie jest wyłączany.
Myślę, że powinieneś dowiedzieć się trochę więcej o wielowątkowości. Pomyśl o tym jak o dozowniku obiektów zwanych „pozwoleniem”. Mówisz Nici, aby zaparkowała, a Nić sprawdza dozownik, jeśli jest „zezwolenie”, Nić bierze ją i wychodzi (bez parkowania). Jeśli w dozowniku nie ma „zezwolenia”, nić jest zaparkowana do czasu uzyskania „zezwolenia” (i można umieścić „zezwolenie” w dozowniku za pomocą
unpark
.Jeśli chodzi o użycie procesora / pamięci, myślę, że zależy to od systemu operacyjnego itp ...
źródło