Háttérmérnökként olyan helyzetekkel kell szembenéznünk, amikor az adatokat aszinkron módon dolgozzuk fel. Ma lássuk, hogyan történik ez Java-ban, és különféle módokon.

Thread

A Java párhuzamosság alapvető, de mégis erőteljes összetevője Thread. A Java szál tulajdonképpen az operációs rendszer szálához kapcsolódik. A létrehozásának alapvető módja a Thread kiterjesztésével és felülbírálásával történik run :

A szál indítása okozza a run() hogy hívják.
Kérdezhetsz; igen, a szálnak rengeteg más módszere van, amelyek felülbírálhatók:

  • A legtöbb esetben nem akarjuk felülírni a szál egyéb módszereit.
  • Miután meghosszabbítjuk a Thread osztályban, a kiterjesztett osztály elveszíti további kiterjesztési képességét, mivel a Java nem támogatja a többszörös öröklődést.
  • Minden szálnak megvan a saját objektuma, amikor kiterjesztjük, és ez nem tesz jót a memória egészségének, ha rengeteg van belőle Objects of the extended Thread létre.

A Java ezeket a problémákat a Runnable felülettel orvosolja. Valójában, Thread túlterhelt metódussal rendelkezik, amely futtatható.

Runnable

Runnable egy olyan interfész, amelynek csak egy módszere van: run(). Igen, a Runnable egy funkcionális interfész, és példánya a lambda függvénnyel hozható létre. Ennek azonban egy egyszerű módja; összetett dolgoknál esetleg szeretnénk megvalósítani. Lásd a különbséget itt. Minden a követelményről szól:

Bár a Runnable-nek van egy run(), ez nem egy szál, hanem csak egy Java osztály, amíg a Thread át nem veszi az irányítást (át nem adja neki). A szál indítása okozza a futtatható objektumot run() hogy hívják.

Igen, a Java megoldotta az 1.5-ös verzióban, és ez Callable.

Callable<V>

Callable egy általános interfész. Miért? A visszatérési érték futtatása a parancs általános parancsaként futtassa ezt a parancsot. A hívható is funkcionális interfész és call() az egyetlen metódus, egy argumentummentes metódus, amely kivételt dob, és általános futtatással adja vissza ezt a parancsértéket.

A Callable megvalósítása nagyon hasonlít a Runnable-hoz:

Lásd itt, a hívás feldolgozza az adatokat, és a végrehajtás után gyűjthető értéket ad vissza. De van-e óriási különbség az előhívásban? Mi használjuk ExecutorService hivatkozni és Future megtartani az eredményt. Beszéljünk arról, hogy miért.

Amint láthatja, a szálak létrehozása és futtatása (futtatható vagy hívható is) nem szabályozott viselkedés. Érdemes lehet szabályozni az egyszerre futó szálak számát, mivel mindegyik az operációs rendszer szálaihoz kapcsolódik. Az általunk futtatott szálak számának kevesebbnek kell lennie, mint a rendelkezésre álló CPU-magok számának. Mindent összevetve, a Java megoldja az által ExecutorService felület.
Fent egy tájékoztató cikk található erről Aszinkron programozás Java nyelven: I. rész.
Ha bármilyen kérdése van a fent megosztott utasításokkal kapcsolatban, forduljon hozzánk bizalommal a megjegyzés rovaton keresztül.