Java ExecutorService je rozhranie, ktoré nám umožňuje vykonávať úlohy na vláknach asynchrónne. Rozhranie Java ExecutorService sa nachádza v balíku java.util.concurrent. ExecutorService pomáha pri udržiavaní skupiny vlákien a priraďuje im úlohy. Poskytuje tiež možnosť zaraďovať úlohy do frontu, kým nebude k dispozícii voľné vlákno, ak je počet úloh väčší ako počet dostupných vlákien.
Metódy Java ExecutorService
Metóda | Popis |
---|---|
booleovské čakanie na ukončenie (dlhý časový limit, jednotka TimeUnit) | Táto metóda blokuje úlohu vstúpiť do ExecutorService, kým sa po požiadavke na vypnutie nedokončia všetky úlohy alebo kým nedôjde k danému časovému limitu alebo kým sa nepreruší aktuálne vlákno, podľa toho, čo nastane skôr. |
Zoznam | Táto metóda vykoná zoznam zadaných úloh a po dokončení vráti zoznam budúcnosti, ktorý obsahuje výsledky všetkých úloh. |
Zoznam | Táto metóda vykoná zoznam zadaných úloh a vráti zoznam futures, ktorý obsahuje výsledky všetkých úloh po dokončení alebo po uplynutí časového limitu, podľa toho, čo nastane skôr. |
T invokeAny(Collection extends Callable>úlohy) | Táto metóda vykoná zoznam zadaných úloh a vráti výsledok jednej úlohy, ktorá sa dokončí bez vyvolania akejkoľvek výnimky. |
T invokeAny(Collection extends Callable>úlohy, dlhý časový limit, jednotka TimeUnit) | Táto metóda vykoná zoznam zadaných úloh a vráti výsledok jednej úlohy, ktorá sa dokončí bez vyvolania akejkoľvek výnimky pred uplynutím časového limitu. |
boolean isShutdown() | Táto metóda vráti, či je daný exekútor vypnutý alebo nie. |
boolean isTerminated() | Táto metóda vráti hodnotu true, ak sa po vypnutí vykonali všetky úlohy. |
void shutdown() | Táto metóda umožňuje dokončenie predtým zadaných úloh ExecutorService a neumožňuje akceptovať žiadne iné úlohy. |
Zoznam vypnutý () | Táto metóda zastaví všetky aktívne vykonávané úlohy, zastaví vykonávanie úloh zaradených do frontu a vráti zoznam úloh, ktoré sú zaradené do frontu. |
Budúce odovzdanie (úloha s možnosťou volania) | Táto metóda odošle úlohu s vrátením hodnoty na vykonanie a vráti budúcnosť, ktorá predstavuje čakajúci výsledok úlohy. |
Budúce odovzdanie (spustiteľná úloha) | Táto metóda odošle úlohu na vykonanie a vráti budúcnosť predstavujúcu túto úlohu. Po úspešnom dokončení vráti hodnotu null. |
Budúce odovzdanie (spustiteľná úloha, výsledok T) | Táto metóda odošle úlohu na vykonanie a vráti budúcnosť predstavujúcu túto úlohu. |
Jednoduchý program Java ExecutorService
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
Výkon:
V tomto programe vytvoríme ExecutorService s desiatimi vláknami a priradíme jej anonymnú spustiteľnú implementáciu, ktorá vykoná úlohu vytlačiť 'ExecutorService' a po skončení jej úlohy službu exekútora vypneme.
Ako používať službu Java ExecutorService
Okamžitá služba ExecutorService
Java ExecutorService môžeme použiť na vytvorenie jedného vlákna, skupiny vlákien alebo naplánovanej skupiny vlákien. Trieda Executors poskytuje výrobné metódy na vytvorenie inštancie ExecutorService nasledovne-
ExecutorService executorService1 = Executors.newSingleThreadExecutor(); //Creates //a ExecutorService object having a single thread. ExecutorService executorService2 = Executors.newFixedThreadPool(10); // Creates a //ExecutorService object having a pool of 10 threads. ExecutorService executorService3 = Executors.newScheduledThreadPool(10); //Creates a scheduled thread pool executor with 10 threads. In scheduled thread //pool, we can schedule tasks of the threads.
Prideľovanie úloh ExecutorServices
Na pridelenie úlohy ExecutorService môžeme použiť nasledujúce metódy-
- vykonať (spustiteľná úloha)
- odoslať (spustiteľná úloha) / odoslať (volateľná úloha)
- invokeAny(Collection extends Callable>úlohy)
- invokeAll(Collection extends Callable>úlohy)
Príklad priradenia úlohy k ExecutorService pomocou metódy execute().
Metóda execute() Java ExecutorService prijíma spustiteľný objekt a vykonáva svoju úlohu asynchrónne. Po zavolaní metódy na vykonanie zavoláme metódu vypnutia, ktorá zablokuje akúkoľvek inú úlohu do frontu v executorService.
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
Výkon:
ExecutorService
Príklad priradenia úlohy k ExecutorService pomocou submit()
Metóda submit() berie spustiteľný objekt a vracia budúci objekt. Tento objekt sa neskôr používa na kontrolu stavu Runnable, či už dokončil spustenie alebo nie.
iteračná mapa java
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); } }
Príklad priradenia úlohy k ExecutorService pomocou metódy invokeAny().
Metóda invokeAny() berie kolekciu objektov Callable alebo objektov tried implementujúcich Callable. Táto metóda vráti budúci objekt volateľného objektu, ktorý sa úspešne vykoná ako prvý.
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); String result = executorService.invokeAny(callables); System.out.println('result = ' + result); executorService.shutdown(); } } </callable></callable>
Výkon:
result = Task 1
Výsledok uloží úlohu 1, pretože prvý volateľný objekt sa úspešne vykoná ako prvý.
Príklad priradenia úlohy k ExecutorService pomocou metódy invokeAll().
Metóda invokeAll() berie kolekciu volateľných objektov s úlohami a vracia zoznam budúcich objektov obsahujúcich výsledok všetkých úloh.
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); java.util.List<future> futures = executorService.invokeAll(callables); for(Future future : futures){ System.out.println('future.get = ' + future.get()); } executorService.shutdown(); } } </future></callable></callable>
Výkon:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Ako vypnúť službu ExecutorService
Keď skončíme s našimi úlohami zadanými ExecutorService, musíme ho vypnúť, pretože ExecutorService vykonáva úlohu v rôznych vláknach. Ak nevypneme službu ExecutorService, vlákna budú naďalej bežať a JVM sa nevypne.
Proces vypnutia sa môže uskutočniť tromi spôsobmi:
- metóda shutdown().
- Metóda shutdownNow().
- metóda waitTermination().