Különbség a várakozás és az alvás között a Java-ban
1. Áttekintés
Ebben a rövid cikkben áttekintjük a szabványt alvás() és várjon() módszereket az alapvető Java-ban, és megérteni a közöttük lévő különbségeket és hasonlóságokat.
2. Általános különbségek Várjon és Alvás
Egyszerűen fogalmazva, várjon() egy példány módszer, amelyet a szálak szinkronizálásához használnak.
Bármely objektumra meghívható, ahogyan pontosan meg van határozva java.lang.objektum, de lehet csak szinkronizált blokkból hívhatók meg. Feloldja az objektum zárját, így egy másik szál beugorhat és megszerezheti a zárat.
Másrészről, Thread.sleep () statikus módszer, amely bármilyen kontextusból meghívható.Thread.sleep () szünetelteti az aktuális szálat, és nem old fel zárakat.
Itt van egy nagyon leegyszerűsített áttekintés e két alapvető API működéséről:
private static Object LOCK = új objektum (); privát statikus void sleepWaitExamples () dobja az InterruptedException {Thread.sleep (1000); System.out.println ("Thread" "+ Thread.currentThread (). GetName () +" "felébred, miután 1 másodpercig aludt" "; szinkronizált (LOCK) {LOCK.wait (1000); System.out.println (az "Object '" + LOCK + "' ébresztés után" + "vár 1 másodpercig); }}
A példa futtatása a következő kimenetet eredményezi:
A „fő” szálat 1 másodperc alvás után ébresztik fel
Az „[email protected]” objektum 1 másodperc várakozás után felébred
3. Ébredés Várjon és Alvás
Amikor használjuk a alvás() módszerrel egy szál egy meghatározott időintervallum után indul el, hacsak nem szakítják meg.
Mert várjon(), az ébredés egy kicsit bonyolultabb. Felkelthetjük a szálat, ha felhívjuk a értesít () vagy értesítMinden () módszerek a monitoron, amelyre várakoznak.
Használat Értesítsen Mindet () ahelyett értesít () amikor fel akarja ébreszteni az összes várakozási állapotban lévő szálat. Hasonlóan a várjon() maga a módszer, értesít (), és értesítMinden () a szinkronizált kontextusból kell meghívni.
Például, itt van, hogyan lehet várjon:
szinkronizált (b) {while (b.sum == 0) {System.out.println ("Várakozás a ThreadB befejezésére ..."); b. várjon (); } System.out.println ("A ThreadB befejeződött." + "A szál összege:" + b.sum); }
És akkor, itt van, hogyan tud egy másik szál akkor felébressze a várakozó szálat - hívással értesít () a monitoron:
int összeg; @Orride public void run () {synchronized (this) {int i = 0; míg (i <100000) {összeg + = i; i ++; } értesít (); }}
A példa futtatása a következő kimenetet eredményezi:
Várakozás a ThreadB befejezésére ...
A ThreadB elkészült. Összeg ebből a szálból: 704982704
4. Következtetés
Ez egy gyors kezdet a szemantikájához várjon és alvás Java-ban.
Általában használnunk kell alvás() egy szál végrehajtási idejének vezérléséhez és várjon() többszálas szinkronizáláshoz. Természetesen még sok mindent meg kell vizsgálni - miután alaposan megértette az alapokat.
Mint mindig, itt is megnézheti a cikkben található példákat a GitHubon.