– Szia Amigo!
– Most mesélek egy kicsit az alvási, hozam- és csatlakozási módszerekről.
"Ez unalmas. Most találtam egy interjúkérdést: "Mi a különbség a hozam (), az alvás () és a várakozás () módszerei között?". Meg tudod ezt magyarázni?
"Semmi probléma. Először is, ez három teljesen különböző módszer."
1) alvás(időtúllépés) – leállítja az aktuális szálat (amelyen az alvást hívták) az időtúllépési paraméter által jelzett számú ezredmásodpercig. A szál ezután TIMED_WAITING állapotba kerül. A metódus korábban véget érhet, ha az isInterrupted jelző be van állítva.
Példa | Leírás |
---|---|
|
Az aktuális szál 500 ezredmásodpercre, azaz 0,5 másodpercre felfüggeszti saját végrehajtását. |
2) result() – az aktuális szál 'kihagyja a fordulóját'. A szál a futó állapotból a kész állapotba kerül, és a JVM továbblép a következő szálra. A futó és kész állapotok a FUTTATÁS állapot alállapotai .
Példa | Leírás |
---|---|
|
Az aktuális szál "kihagyja a sorát", és a Java azonnal átvált a következő szálra. |
3) várakozás (időtúllépés) – ez a várakozás () módszer egyik változata, de időtúllépéssel. "A várakozás metódus csak egy szinkronizált blokkon belül hívható meg az aktuális szál által zárolt mutex objektumon. Ellenkező esetben a metódus illegális MonitorState kivételt dob.
"A metódus meghívása feloldja a mutex objektum zárolását, így elérhetővé válik egy másik szál számára. Ezen túlmenően a szál VÁRAKOZÁS állapotba kerül (a várakozás() metódushoz paraméterek nélkül) vagy TIMED_WAITING állapotba (a wait(timeout) ) módszer).
Példa | Leírás |
---|---|
|
A várakozási metódus meghívásakor az aktuális szál feloldja a megfigyelő objektum zárolását, és 500 ezredmásodpercig alszik. A monitor objektumot egy másik szál is megszerezheti. 500 ezredmásodperc elteltével a szál felébred, és ha a monitor nem foglalt, a szál felveszi azt, és tovább működik. Ha a monitort egy másik szál zárolja, az aktuális szál BLOKKOLVA állapotba vált. |
4) csatlakozás (időtúllépés)
"Ez a metódus nem szerepelt a kérdésedben, de benne van az óratervemben, szóval mesélek róla. Amikor meghívod a join() vagy join(timeout) metódust, az aktuális szál "csatolódik" a szálhoz amely ezt a metódust hívta. Az aktuális szál alvó állapotba kerül, és megvárja, amíg az összekapcsolt szál befejeződik (azaz az a szál, amelynek a join() metódust hívták)."
"Az aktuális szál a WAITING állapotba lép a join() metódusnál és a TIMED_WAITING állapotba a join(timeout) metódusnál."
Példa | Leírás |
---|---|
|
Az aktuális szál csatlakozik a workerThread szálhoz, és megvárja a végét. De 500 ezredmásodperc után „kikapcsol”, és tovább fut. |
"A várakozás(időtúllépés) és a join(timeout) metódusok időtúllépése azt jelenti, hogy a metódus alvó állapotba megy és vár valamire, de nem tovább, mint a milliszekundumban megadott időtúllépés. Aztán felébred."
"Úgy tűnik, hogy ezekben a módszerekben az egyetlen közös dolog az időtúllépés. Teljesen más dolgokat csinálnak."
– Igen, így van.
GO TO FULL VERSION