Čo je ExecutorService v Jave a ako ju vytvoriť?



Tento článok sa venuje konceptu podrozhrania Executor ExecutorService v Jave s rôznymi príkladmi na vysvetlenie vytvárania a správy vlákien v Jave.

Programovací jazyk Java pracuje veľmi efektívne aplikácie, ktoré vyžadujú, aby sa úlohy vykonávali súčasne vo vlákne. Pre každú aplikáciu je ťažké vykonať veľké množstvo vlákien súčasne. Aby sme tento problém prekonali, je dodávaný s ExecutorService, ktorá je sub-rozhraním . V tomto článku sa budeme zaoberať funkčnosťou ExecutorService v Jave. Nasledujúce témy sú predmetom tohto blogu:

Čo je to Executor Framework?

Je pomerne jednoduchšie vytvoriť a vykonať jedno alebo dve vlákna súčasne. Je to však ťažké, keď sa počet vlákien zvýši na značný počet. Veľké aplikácie s viacerými vláknami budú mať súčasne spustené stovky vlákien. Preto má úplný zmysel oddeliť vytváranie vlákien od správy vlákien v aplikácii.





Exekútorom je a pomáha vám pri vytváraní a správe vlákien v aplikácii. The vám pomôže pri nasledujúcich úlohách.

  • Vytváranie vlákien: Poskytuje rôzne metódy na vytváranie vlákien, ktoré pomáhajú pri súčasnom spustení vašich aplikácií.



  • Správa vlákna: Spravuje tiež životný cyklus vlákna. Pred vykonaním úlohy sa nemusíte obávať, či je vlákno aktívne, zaneprázdnené alebo mŕtve.

  • Zadávanie a vykonávanie úloh: Rámec exekútora poskytuje metódy na zadávanie úloh v oblasti vlákien. Poskytuje tiež oprávnenie rozhodnúť, či sa vlákno vykoná alebo nie.

Exekutorska sluzba-Exekutorska sluzba v jave -edureka

ExecutorService v jazyku Java Príklad

Jedná sa o sub-rozhranie implementačného rámca, ktoré pridáva určité funkcie na správu životného cyklu vlákna aplikácie. Poskytuje tiež metódu submit (), ktorá akceptuje spustiteľné aj volané položky predmety.



V nasledujúcom príklade vytvoríme ExecutorService s jedným vláknom a potom zadáme úlohu, ktorá sa má vykonať vo vnútri vlákna.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors verejná trieda Prí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 (' odoslať úlohu určenú spustiteľným súborom vykonateľnej službe ') executorservice.submit (spustiteľný súbor)}}
 Výkon: Vnútri: hlavné vytváranie ExecutorService vytváranie spustiteľnej úlohy zadať úlohu určenú spustiteľnou položkou vykonávacej službe vo vnútri: pool-1-thread-1

Vyššie uvedené ukazuje, ako môžeme vytvoriť ExecutorService a vykonať úlohu vo vnútri exekútora. Ak je úloha odoslaná na vykonanie a vlákno je momentálne zaneprázdnené vykonávaním inej úlohy, potom bude úloha čakať v poradí, kým ju vlákno nebude môcť vykonať.

Keď spustíte vyššie uvedený program, program sa nikdy neopustí. Budete ho musieť výslovne vypnúť, pretože služba exekútora stále počúva na nové úlohy.

Implementácie Java ExecutorService

ExecutorService je veľmi podobný fondu vlákien. V skutočnosti je implementácia služby ExecutorService v súbore java.util.concurrent balíček je implementácia vlákna. ExecutorService má v balíku java.util.concurrent nasledujúce implementácie:

ThreadPoolExecutor

ThreadPoolExecutor vykonáva dané úlohy pomocou jedného zo svojich vnútorne združených vlákien.

Vytvára sa threadPoolExecutor

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

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor je ExecutorService, ktorá dokáže naplánovať, aby sa úlohy spúšťali s oneskorením alebo aby sa vykonávali opakovane s pevným časovým intervalom medzi jednotlivými vykonaniami.

Príklad

ScheduledExecutorService scheduledexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture scheduledfuture = scheduledExecutorService.schedule (new Callable () {public Object call () vyvolá výnimku {System.out.println ('prevedený') návrat 's názvom'}}, 5, TimeUnit. SEKUNDY)

Využitie služby ExecutorService

Existuje niekoľko rôznych spôsobov, ako delegovať úlohy na ExecutorService.

  • spustiť (spustiteľné)

  • odoslať (spustiteľné)

  • invokeAny ()

  • invokeAll ()

Spustiť spustiteľný súbor

Spustenie služby Java ExecutorService (Runnable) vezme objekt java.lang.Runnable a vykoná ho asynchrónne.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (new Runnable () {public void run () {System.out.println ('asynchrónna úloha')}}) executorService.shutdown ()

Neexistuje spôsob, ako získať výsledok spustiteľného spustiteľného programu, pretože na to musíte použiť Vyvolávateľnú.

Odoslať spustiteľné

Metóda Java ExecutorService submit (Runnable) vezme implementáciu Runnable a vráti budúci objekt. Budúci objekt možno použiť na kontrolu, či sa spustiteľný súbor ukončil.

Future future = executorService.submit (new Runnable () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // vráti null, ak je úloha dokončená správne.

Odoslať na požiadanie

Metóda submit (Callable) Java ExecutorService je podobná metóde submit (Runnable), ale namiesto 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ýkon: Asynchroous callable future.get = Výsledok, ktorý je možné zavolať

invokeAny ()

Metóda invokeAny () preberá kolekciu Callable objektov. Vyvolanie tejto metódy nevráti žiadnu budúcnosť, ale vráti výsledok jedného z Callable objektov.

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 .vypnúť()

Keď spustíte vyššie uvedený kód, výsledok sa zmení. Môže to byť úloha A, úloha B a tak ďalej.

InvokeAll ()

Metóda invokeAll () vyvolá všetky Callable objekty odovzdané ako parametre. Vráti budúce objekty, ktoré možno použiť na získanie výsledkov vykonania každej Vyvolávateľnej.

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 (volané čísla) pre (Future future: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Spustiteľné vs Vyvolávateľné

Spustiteľné a volané rozhrania sú si navzájom veľmi podobné. Rozdiel je viditeľný vo vyhlásení rozhrania. Obe rozhrania predstavujú úlohu, ktorú je možné vykonať súčasne vláknom alebo ExecutorService.

Vyžiadateľné vyhlásenie:

verejné rozhranie Vyzývateľné {public object call () throws Exception}

Spustiteľné vyhlásenie:

verejné rozhranie spustiteľné {public void run ()}

Hlavný rozdiel medzi nimi spočíva v tom, že metóda call () môže vrátiť objekt z volania metódy. A metóda call () môže hodiť zatiaľ čo metóda run () nemôže.

má vs je java

zrušiť úlohu

Úlohu odoslanú do ExecutorService môžete zrušiť jednoduchým volaním metódy zrušenia v budúcnosti odoslanej pri zadaní úlohy.

future.cancel ()

Vypnutie služby ExecutorService

Aby ste zabránili spusteniu vlákien aj po dokončení vykonávania, mali by ste ExecutorService vypnúť.

vypnúť()

Ak chcete ukončiť vlákna vo vnútri ExecutorService, môžete zavolať metódu shutdown ().

executorService.shutdown ()

Týmto sa dostávame na koniec tohto článku, kde sme sa dozvedeli, ako môžeme pomocou ExecutorService vykonávať úlohy vo vlákne. Dúfam, že máte prehľad o všetkom, čo bolo s vami zdieľané v tomto tutoriále.

Ak sa vám tento článok o „ExecutorService v Jave“ zdal relevantný, pozrite si stránku dôveryhodná online vzdelávacia spoločnosť so sieťou viac ako 250 000 spokojných študentov rozmiestnených po celom svete.

Sme tu, aby sme vám pomohli na každom kroku na vašej ceste a prišli s učebným plánom, ktorý je určený pre študentov a profesionálov, ktorí sa chcú stať vývojármi Java. Kurz je navrhnutý tak, aby vám dal náskok v programovaní v jazyku Java a naučil vás základné aj pokročilé koncepty Java spolu s rôznymi Páči sa mi to Hibernácia & .

Ak narazíte na akékoľvek otázky, neváhajte sa ich opýtať v sekcii komentárov „ExecutorService in Java“ a náš tím vám rád odpovie.