– 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
Thread.sleep(500);
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
Thread.yield();
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
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
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
Thread thread = getWorkThread();
thread.join(500);
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.