Implementacija pokrenute vs proširivanje niti

1. Uvod

“Trebam li primijeniti a Izvodljivo ili produžiti Nit razred ”? prilično je često pitanje.

U ovom ćemo članku vidjeti koji pristup ima više smisla u praksi i zašto.

2. Korištenje Nit

Prvo definirajmo a SimpleThread razred koji se proteže Nit:

javna klasa SimpleThread proširuje Thread {private String message; // standardni zapisnik, konstruktor @Preuzmi javnu void run () {log.info (poruka); }}

Pogledajmo i kako možemo pokrenuti nit ove vrste:

@Test public void givenAThread_whenRunIt_thenResult () baca iznimku {Thread thread = new SimpleThread ("SimpleThread izvršena pomoću Thread"); nit.start (); nit.join (); }

Također možemo koristiti ExecutorService za izvršavanje niti:

@Test public void givenAThread_whenSubmitToES_thenResult () baca iznimku {executorService.submit (new SimpleThread ("SimpleThread izvršena pomoću ExecutorService")). Get (); }

To je prilično puno koda za izvođenje jedne operacije dnevnika u zasebnoj niti.

Također, imajte na umu da SimpleThread ne može proširiti nijednu drugu klasu, jer Java ne podržava višestruko nasljeđivanje.

3. Provedba a Izvodljivo

Ajmo sada stvoriti jednostavan zadatak koji implementira java.lang.Izvodljiv sučelje:

klasa SimpleRunnable implementira Runnable {private String message; // standardni zapisnik, konstruktor @Preuzmi javnu void run () {log.info (poruka); }}

Iznad SimpleRunnable je samo zadatak koji želimo pokrenuti u zasebnoj niti.

Postoje različiti pristupi koje možemo koristiti za njegovo pokretanje; jedan od njih je korištenje Nit razred:

@Test public void givenRunnable_whenRunIt_thenResult () baca iznimku {Thread thread = new Thread (new SimpleRunnable ("SimpleRunnable izveden pomoću Thread")); nit.start (); nit.join (); }

Možemo čak koristiti i ExecutorService:

@Test public void givenARunnable_whenSubmitToES_thenResult () baca izuzetak {executorService.submit (new SimpleRunnable ("SimpleRunnable izvršava se pomoću ExecutorService")). Get (); }

Možemo pročitati više o ExecutorService ovdje.

Budući da sada implementiramo sučelje, slobodno možemo proširiti još jednu osnovnu klasu ako je potrebno.

Počevši od Jave 8, svako sučelje koje izlaže jednu apstraktnu metodu tretira se kao funkcionalno sučelje, što ga čini valjanim ciljem lambda izraza.

Gore navedeno možemo prepisati Izvodljivo kod pomoću lambda izraza:

@Test public void givenARunnableLambda_whenSubmitToES_thenResult () baca izuzetak {executorService.submit (() -> log.info ("Lambda runnable izvršena!")); }

4. Izvodljivo ili Nit?

Jednostavno rečeno, općenito potičemo upotrebu Izvodljivo nad Nit:

  • Prilikom produženja Nit klase, ne nadjačavamo niti jednu od njegovih metoda. Umjesto toga, nadjačavamo metodu Izvodljivo (koji Nit dogodi se provesti). Ovo je očito kršenje IS-A Nit načelo
  • Izrada implementacije Izvodljivo i prosljeđujući ga na Nit klasa koristi sastav, a ne nasljeđivanje - što je fleksibilnije
  • Nakon produženja Nit razreda, ne možemo produžiti nijedan drugi razred
  • Od Jave 8 nadalje, Runnables mogu se predstaviti kao lambda izrazi

5. Zaključak

U ovom smo brzom vodiču vidjeli kako se implementira Izvodljivo je obično bolji pristup od proširenja Nit razred.

Kôd za ovaj post možete pronaći na GitHubu.