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.