– Szia Amigo!
– Új témát indítunk: a szálakat.
"Kezdjük el. Ma megvizsgáljuk azokat az állapotokat, amelyeken a Thread objektum áthalad (vagy áthaladhat), amikor egy szál fut."
– Hány államot tudsz most megnevezni, Amigo?
"Kettő. Az első egy szál a start() metódus meghívása előtt: az objektum létezik, de a szál még nem aktív. A második pedig a start() metódus meghívása után van: amikor a szál csinál valamit fontos."
"Igazad van – van egy ilyen megkülönböztetés. Ezeket az állapotokat új és futó állapotoknak nevezik , de ez még csak a kezdet."
"Először is, egy ponton a szál befejezi a futást, ami azt jelenti, hogy előfordulhat olyan helyzet, amikor a Thread objektum létezik, de a szál nincs új vagy futó állapotban. megszűnt ."
"De van még több is. Ne felejtsd el, hogy egy adott időpontban csak egy szál fut valójában. Ami egyidejű munkának tűnik, az valójában az, hogy a processzor folyamatosan szálról szálra ugrik. Van egy külön állapot, amikor a szál úgy tűnik, fut, de valójában várja a sorát: késznek hívják . Ahogy egy szál működik, folyamatosan futásból készre vált , majd vissza futásra , amikor újra aktívvá válik."
"A start () metódus meghívása után azonnal a szálhoz hozzárendeli a futtatásra kész állapotot, és bekerül a szálak megosztott listájába, amelyek között a JVM vált."
"Ez nem túl nehéz. Mielőtt elkezdené a futást, az új állapota van. Miután befejezte, leáll . Amikor fut, a szál futó állapotban van ; majd amikor vár, kész állapotban van ."
– Elképesztő a rövidséged, de igazad van.
"De van még több is. A szál blokkolható. Például amikor beírsz egy szinkronizált blokkot. Ha egy szál eljut egy szinkronizáltként megjelölt kódblokkhoz, és egy másik szál használja, akkor a szálunk blokkolt állapotba kerül és vár hogy az objektum mutex (zár) feloldódjon."
"Íme, hogy néz ki ez a helyzet az államokkal:"
"De van több is. Van egy külön állapot is, amit várnak . Ez az, amikor egy szál nincs blokkolva , de nincs is készen . Például amikor meghívod a join () metódust egy másik szálon."
Ha egy másik Thread objektumon meghívjuk a join()-t, akkor olyan, mintha a mi szálunk "csatlakozna" hozzá, de valójában csak arra vár, hogy a másik szál véget érjen.
"Emellett van még a wait () metódus is (a wait/notify/notifyAll metódushármasból), amely meghívásakor egy szálat várakozó állapotba kapcsol."
– Hú.
"Várj egy percet! Van még több. Egy szál aludhat például az alvásmódszer meghívásával. Erre is van egy külön állapot. Ezt úgy hívják, hogy "időzített várakozás". Az "időzített várakozás" azt jelenti, hogy a szál vár valamire Ha egy várakozási metódust hív meg egy paraméterrel, mint például a wait(timeout) vagy a join(timeout), akkor a szál időzített várakozási állapotba kerül."
"Íme a teljes diagram:"
"Hmm. Ez minden? Vagy van még 10 érdekes állapot?"
– Egyelőre ennyi.
"A gyakorlatban csak az első diagramra emlékszel. Egyszerűbb. De a második pontosabb."
"Furcsa módon nagyon sok szál állapotdiagram található az interneten, és mindegyik más."
– Ezért adtam neked ezt a diagramot – ez a legteljesebb és leghelyesebb.
"Ebben a diagramban a készenléti és a futó állapotokat egyetlen blokkban egyesítik, amelyeket futtathatónak neveznek. Tudja, miért?"
– Nem. Most látok először ilyesmit.
"A Thread osztálynak van egy State nevű belső osztálya , valamint egy nyilvános State getState() metódus."
public enum State
{
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
"Mindig meghívhatja a getState () metódust egy Thread objektumon, és megtudhatja az aktuális állapotát. És természetesen ez lesz a State enum egyik értéke."
"Értem. Tehát a valódi állapotok a JVM-en belül vannak, de vannak olyan állapotok is, amelyeket a State getState() metódussal lehet elérni Java kódon keresztül."
– És milyen körülmények között használnám?
– Nagy valószínűséggel soha.
"De tudnod kell, hogy mi történik a szálakon belül. Ellenkező esetben sok hiba lesz, és még csak kitalálni sem fogod, hogy mi okozza őket."
"Ráadásul a munkaadók szeretnek a téma állapotairól kérdezni az interjúk során."
GO TO FULL VERSION