Futható vs szál meghosszabbítása
1. Bemutatkozás
„Meg kell-e valósítanom a Futható vagy meghosszabbítja a cérna osztály"? elég gyakori kérdés.
Ebben a cikkben meglátjuk, hogy melyik megközelítésnek van értelme a gyakorlatban és miért.
2. Használata cérna
Először definiáljuk a SimpleThread osztály, amely kiterjed cérna:
public class A SimpleThread kiterjeszti a Thread {private String üzenetet; // szabványos napló, konstruktor @Orride public void run () {log.info (üzenet); }}
Lássuk azt is, hogyan futtathatunk ilyen típusú szálakat:
@Test public void givenAThread_whenRunIt_thenResult () dobja a {Kivétel szálat = új SimpleThread ("A Thread használatával végrehajtott SimpleThread"); szál.indítás (); szál.csatlakozzon (); }
Használhatunk egy ExecutorService a szál végrehajtásához:
@Test public void givenAThread_whenSubmitToES_thenResult () dobja a {Kivétel {végrehajtóSzolgáltatás.submit (új SimpleThread ("Az ExecutorService segítségével végrehajtott SimpleThread")). Get (); }
Ez elég sok kód egy napló művelet futtatásához külön szálban.
Ezt is vegye figyelembe SimpleThread nem bővíthet más osztályt, mivel a Java nem támogatja a többszörös öröklést.
3. Megvalósítása a Futható
Most hozzunk létre egy egyszerű feladatot, amely végrehajtja a java.lang.Futtatható felület:
class SimpleRunnable megvalósítja Runnable {private String üzenet; // szabványos napló, konstruktor @Orride public void run () {log.info (üzenet); }}
A fenti SimpleRunnable csak egy feladat, amelyet külön szálon szeretnénk futtatni.
Különféle megközelítések használhatók a futtatásához; egyikük a cérna osztály:
@Test public void givenRunnable_whenRunIt_thenResult () dobja a Kivételt {Szál szál = új Szál (új SimpleRunnable ("A szál használatával végrehajtott SimpleRunnable"); szál.indítás (); szál.csatlakozzon (); }
Használhatunk akár egy ExecutorService:
@Test public void givenARunnable_whenSubmitToES_thenResult () dobja a (z) {Kivétel {végrehajtóService.submit (új SimpleRunnable ("Az ExecutorService segítségével végrehajtott SimpleRunnable")) kivételt. Get (); }
Bővebben olvashatunk ExecutorService itt.
Mivel most egy interfészt implementálunk, szabadon kibővíthetünk egy másik alaposztályt, ha szükséges.
A Java 8-tól kezdve minden olyan felületet, amely egyetlen absztrakt módszert mutat be, funkcionális interfészként kezelünk, ami érvényes lambda kifejezés célpontjává teszi.
A fentieket átírhatjuk Futható kódot lambda kifejezéssel:
@Test public void givenARunnableLambda_whenSubmitToES_thenResult () dobja a Kivételt {végrehajtóService.submit (() -> log.info ("Lambda futtatható végrehajtva!")); }
4. Futható vagy cérna?
Egyszerűen fogalmazva, általában javasoljuk a Futható felett cérna:
- Amikor meghosszabbítja a cérna osztályban, egyik módszerét sem írjuk felül. Ehelyett felülírjuk a metódust Futható (melyik cérna történhet megvalósítani). Ez az IS-A egyértelmű megsértése cérna elv
- A megvalósítás létrehozása Futható és átadta a cérna osztály az összetételt és nem az öröklést használja - ami rugalmasabb
- Miután meghosszabbította a cérna osztály, nem bővíthetünk más osztályt
- Java 8-tól kezdve, Futható lambda kifejezésekként ábrázolhatók
5. Következtetés
Ebben a gyors bemutatóban láthattuk a megvalósítás módját Futható általában jobb megközelítés, mint a cérna osztály.
A bejegyzés kódja megtalálható a GitHub oldalon.