Co je ExecutorService v Javě a jak ji vytvořit?



Tento článek popisuje koncept podrozhraní Executor ExecutorService v Javě s různými příklady, které vysvětlují vytváření a správu vláken v Javě.

Programovací jazyk Java pracuje velmi efektivně aplikace, které vyžadují souběžné provádění úloh ve vlákně. Pro jakoukoli aplikaci je obtížné spouštět současně velký počet vláken. Abychom tento problém překonali, přichází s ExecutorService, která je dílčím rozhraním . V tomto článku probereme funkčnost ExecutorService v Javě. Následující témata se zabývají tímto blogem:

Co je to Executor Framework?

Je poměrně snazší vytvořit a spustit jedno nebo dvě vlákna současně. Ale stane se obtížným, když se počet vláken zvýší na významný počet. Velké aplikace s více vlákny budou mít stovky vláken spuštěných současně. Proto má úplný smysl oddělit vytváření podprocesů od správy podprocesů v aplikaci.





Exekutor je a pomáhá vám při vytváření a správě vláken v aplikaci. The vám pomůže v následujících úkolech.

  • Vytváření podprocesů: Poskytuje celou řadu metod pro vytváření podprocesů, které pomáhají souběžně spouštět vaše aplikace.



  • Správa vláken: Spravuje také životní cyklus vlákna. Před odesláním úlohy k provedení se nemusíte bát, zda je vlákno aktivní, zaneprázdněné nebo mrtvé.

  • Zadávání a provádění úkolů: Rámec prováděcího programu poskytuje metody pro zadávání úkolů ve fondu podprocesů. Poskytuje také pravomoc rozhodnout, zda bude podproces proveden či nikoli.

Exekutorská služba-Exekutorská služba v java -edureka

ExecutorService v Javě Příklad

Jedná se o dílčí rozhraní implementačního rámce, které přidává určité funkce pro správu životního cyklu vlákna aplikace. Poskytuje také metodu submit (), která může přijímat jak spustitelné, tak volatelné předměty.



V následujícím příkladu vytvoříme ExecutorService s jedním vláknem a poté odešleme úkol, který má být spuštěn uvnitř vlákna.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors veřejná třída Příklad {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('creating ExecutorService') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('creating a runnable') Runnable runnable = () -> {System.out.println ('inside: '+ Thread.currentThread (). GetName ())} System.out.println (' odeslat úlohu specifikovanou v runnable do executorservice ') executorservice.submit (runnable)}}
 Výstup: Inside: main creating ExecutorService creating a runnable submit the task specified by the runnable to the executorservice inside: pool-1-thread-1

Výše ukazuje, jak můžeme vytvořit ExecutorService a provést úkol uvnitř exekutora. Pokud je úkol odeslán k provedení a vlákno je aktuálně zaneprázdněno prováděním jiného úkolu, bude úkol čekat ve frontě, dokud vlákno nebude mít možnost jej spustit.

Když spustíte výše uvedený program, program se nikdy neopustí. Budete jej muset výslovně vypnout, protože služba vykonavatele stále naslouchá novým úkolům.

Implementace služby Java ExecutorService

ExecutorService je velmi podobný fondu vláken. Ve skutečnosti implementace ExecutorService v java.util.concurrent balík je implementace podprocesu. ExecutorService má v balíčku java.util.concurrent následující implementace:

ThreadPoolExecutor

ThreadPoolExecutor provede dané úkoly pomocí jednoho ze svých interně sdružených vláken.

Vytvoření threadPoolExecutor

int corePoolSize = 5 int maxPoolSize = 10 long keepAliveTime = 5000 ExecutorService threadPoolExecutor = new threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue ())

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor je ExecutorService, která může naplánovat spuštění úloh po zpoždění nebo opakované provádění s pevným časovým intervalem mezi každým provedením.

Příklad

ScheduledExecutorService scheduledexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture scheduledfuture = scheduledExecutorService.schedule (nové volání Callable () {public Object () vyvolá výjimku {System.out.println ('spuštěný') návrat 's názvem'}}, 5, TimeUnit. SEKUNDY)

Využití služby ExecutorService

Existuje několik různých způsobů, jak delegovat úkoly na ExecutorService.

  • spustit (Runnable)

  • Odeslat (Spustitelné)

  • invokeAny ()

  • invokeAll ()

Spustit spustitelný soubor

Spustit Java ExecutorService (Runnable) vezme objekt java.lang.Runnable a provede jej asynchronně.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (new Runnable () {public void run () {System.out.println ('asynchronous task')}}) executorService.shutdown ()

Neexistuje žádný způsob, jak získat výsledek spuštění Runnable, protože musíte použít Callable.

Odeslat spustitelné

Metoda odeslání Java ExecutorService (Runnable) přebírá implementaci Runnable a vrací budoucí objekt. Budoucí objekt lze použít ke kontrole, zda Runnable dokončil provádění.

Future future = executorService.submit (new Runnable () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // vrací null, pokud je úkol dokončen správně.

Odeslat Callable

Metoda odeslání Java ExecutorService (Callable) je podobná metodě submit (Runnable), ale místo Runnable trvá Java Callable.

Future future = executorService.submit (new Callable () {public Object call () throws Exception {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'future.get ())
 Výstup: Asynchroous callable future.get = Výsledek, který lze volat

invokeAny ()

Metoda invokeAny () přebírá kolekci Callable objektů. Vyvolání této metody nevrací žádnou budoucnost, ale vrátí výsledek jednoho z Callable objektů.

ExecutorService executorService = Sada Executors.newSingleThreadExecutor ()callables = nový HashSet() callables.add (new Callable () {public String call () throws Exception {return'task A '}}) callables.add (new Callable () {public String call () throws Exception {return'task B'} }) callables.add (new Callable () {public String call () throws Exception {return'task C '}}) String result = executorService.invokeAny (callables) System.out.println (' result = '+ result) executorService .vypnout()

Když spustíte výše uvedený kód, výsledek se změní. Může to být úkol A, úkol B atd.

InvokeAll ()

Metoda invokeAll () vyvolá všechny Callable objekty předané jako parametry. Vrátí budoucí objekty, které lze použít k získání výsledků provádění každé Callable.

ExecutorService executorService = Sada Executors.newSingleThreadExecutor ()callables = nový HashSet() callables.add (new Callable () {public String call () throws Exception {return 'Task A'}}) callables.add (new Callable () {public String call () throws Exception {return 'Task B'} }) callables.add (new Callable () {public String call () throws Exception {return 'Task C'}}) Listfutures = executorService.invokeAll (callables) pro (Future future: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Runnable vs Callable

Spustitelná a volaná rozhraní jsou si navzájem velmi podobná. Rozdíl je viditelný v prohlášení rozhraní. Obě rozhraní představují úlohu, kterou lze provést současně vláknem nebo ExecutorService.

Vyvolatelné prohlášení:

veřejné rozhraní Vyvolatelné {volání veřejného objektu () vyvolá výjimku}

Spustitelná deklarace:

veřejné rozhraní Spustitelné {public void run ()}

Hlavní rozdíl mezi těmito dvěma je, že metoda call () může vrátit objekt z volání metody. A metoda call () může hodit zatímco metoda run () nemůže.

výukové programy pro Microsoft SQL Server pro začátečníky

zrušit úkol

Úlohu odeslanou do ExecutorService můžete zrušit jednoduchým voláním metody zrušení u budoucího odeslání při odeslání úkolu.

future.cancel ()

Vypnutí služby ExecutorService

Chcete-li zabránit spuštění vláken i po dokončení spuštění, měli byste ExecutorService vypnout.

vypnout()

Chcete-li ukončit vlákna uvnitř ExecutorService, můžete zavolat metodu shutdown ().

executorService.shutdown ()

Tím se dostáváme na konec tohoto článku, kde jsme se naučili, jak můžeme pomocí ExecutorService provádět úkoly ve vlákně. Doufám, že máte jasno se vším, co bylo s vámi v tomto tutoriálu sdíleno.

Pokud jste shledali tento článek týkající se „ExecutorService v Javě“ relevantní, podívejte se na důvěryhodná online vzdělávací společnost se sítí více než 250 000 spokojených studentů po celém světě.

Jsme tu, abychom vám pomohli s každým krokem na vaší cestě a přišli s osnovami určenými pro studenty a profesionály, kteří chtějí být vývojářem Java. Kurz je navržen tak, aby vám poskytl náskok v programování Java a naučil vás základní i pokročilé koncepty Java spolu s různými jako Přezimovat & .

Pokud narazíte na jakékoli dotazy, neváhejte se zeptat na všechny své dotazy v sekci komentářů „ExecutorService v Javě“ a náš tým vám rád odpoví.