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.