„Java ExecutorService“ yra sąsaja, leidžianti asinchroniškai vykdyti užduotis gijose. Java ExecutorService sąsaja yra java.util.concurrent pakete. „ExecutorService“ padeda išlaikyti gijų telkinį ir priskiria joms užduotis. Ji taip pat suteikia galimybę statyti užduotis į eilę, kol atsiras nemokama gija, jei užduočių skaičius yra didesnis nei turimų gijų.
Java ExecutorService metodai
Metodas | apibūdinimas |
---|---|
loginis laukimo terminas (ilgas skirtasis laikas, laiko vienetas) | Šis metodas blokuoja užduotį norint patekti į „ExecutorService“, kol visos užduotys bus baigtos po išjungimo užklausos arba pasibaigs nurodytas laikas arba nutrūks dabartinė gija, atsižvelgiant į tai, kas įvyks anksčiau. |
Sąrašas | Šis metodas vykdo pateiktų užduočių sąrašą ir grąžina ateities sandorių sąrašą, kuriame yra visų atliktų užduočių rezultatai. |
Sąrašas | Šis metodas vykdo pateiktų užduočių sąrašą ir grąžina ateities sandorių sąrašą, kuriame yra visų užduočių rezultatai, kai jie bus baigti arba pasibaigia skirtasis laikas, atsižvelgiant į tai, kas įvyksta anksčiau. |
T invokeAny(Kolekcija extends Callable>užduotys) | Šis metodas vykdo pateiktų užduočių sąrašą ir grąžina vienos užduoties rezultatą, kuri bus atlikta be jokių išimčių. |
T invokeAny(Kolekcija extends Callable>užduotys, ilgas laikas, laiko vienetas) | Šis metodas įvykdo pateiktų užduočių sąrašą ir grąžina vienos užduoties rezultatą, kuris yra atliktas be jokių išimčių prieš pasibaigiant skirtajam laikui. |
loginis isShutdown() | Šis metodas grąžina, ar nurodytas vykdytojas išjungtas, ar ne. |
loginis yra Terminated() | Šis metodas grąžina teisingą, jei visos užduotys buvo įvykdytos po išjungimo. |
negaliojantis išjungimas () | Šis metodas leidžia atlikti anksčiau „ExecutorService“ pateiktas užduotis ir neleidžia priimti jokių kitų užduočių. |
Sąrašo išjungimas dabar () | Šis metodas sustabdo visas aktyviai vykdomas užduotis, sustabdo eilėje esančių užduočių vykdymą ir grąžina eilėje esančių užduočių sąrašą. |
Būsimas pateikimas (užduotis, kurią galima iškviesti) | Šis metodas pateikia vykdyti vertę grąžinančią užduotį ir grąžina ateitį, kuri rodo laukiantį užduoties rezultatą. |
Būsimas pateikimas (vykdoma užduotis) | Šis metodas pateikia užduotį vykdyti ir grąžina tą užduotį reprezentuojančią ateitį. Sėkmingai užbaigus, jis grąžina nulį. |
Būsimas pateikimas (vykdoma užduotis, T rezultatas) | Šis metodas pateikia užduotį vykdyti ir grąžina tą užduotį reprezentuojančią ateitį. |
Paprasta Java ExecutorService programa
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(); } }
Išvestis:
prioritetinė eilė c++
Šioje programoje mes kuriame dešimties gijų „ExecutorService“ ir priskiriame jai anoniminį paleidžiamą diegimą, kuris atlieka užduotį spausdinti „ExecutorService“, o pasibaigus jos užduočiai išjungiame vykdytojo paslaugą.
Kaip naudotis Java ExecutorService
Instantiating ExecutorService
Galime naudoti „Java ExecutorService“, kad sukurtume vieną giją, gijų telkinį arba suplanuotą gijų telkinį. Vykdytojų klasėje pateikiami gamykliniai metodai, skirti ExecutorService sukurti taip:
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.
Užduočių priskyrimas „ExecutorServices“.
Norėdami priskirti užduotį „ExecutorService“, galime naudoti šiuos metodus:
- vykdyti (vykdoma užduotis)
- pateikti (vykdoma užduotis) / pateikti (iškviečiama užduotis)
- invokeAny(Kolekcija extends Callable>užduotys)
- invokeAll(Kolekcija extends Callable>užduotys)
Užduoties priskyrimo „ExecutorService“ naudojant execute() metodą pavyzdys
if ir else in bash
Java ExecutorService metodas execute() priima paleidžiamą objektą ir atlieka savo užduotį asinchroniškai. Atlikę iškvietimo vykdymo metodą, iškviečiame išjungimo metodą, kuris blokuoja bet kokią kitą užduotį, kad ji atsidurtų eilėje 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(); } }
Išvestis:
ExecutorService
Užduoties priskyrimo „ExecutorService“ naudojant submit() pavyzdys
Metodas submit() paima paleidžiamą objektą ir grąžina būsimą objektą. Šis objektas vėliau naudojamas norint patikrinti Runnable būseną, ar jis baigtas, ar ne.
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'); } }); } }
Užduoties priskyrimo „ExecutorService“ naudojant invokeAny() metodą pavyzdys
Metodas invokeAny() paima Callablle objektų rinkinį arba klasių objektus, įgyvendinančius Callable. Šis metodas grąžina būsimą iškviečiamo objekto objektą, kuris sėkmingai vykdomas pirmiausia.
svyruojantis css
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>
Išvestis:
result = Task 1
Rezultate išsaugoma 1 užduotis, nes pirmasis iškviečiamas objektas yra sėkmingai įvykdytas pirmiausia.
Užduoties priskyrimo „ExecutorService“ naudojant invokeAll() metodą pavyzdys
kietais viršeliais vs minkštais viršeliais
Metodas invokeAll() paima iškviečiamų objektų, turinčių užduotis, rinkinį ir pateikia būsimų objektų sąrašą, kuriame yra visų užduočių rezultatai.
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>
Išvestis:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Kaip išjungti „ExecutorService“.
Baigę užduotis, suteiktas „ExecutorService“, turime ją išjungti, nes „ExecutorService“ atlieka užduotį skirtingose gijose. Jei neišjungsime „ExecutorService“, gijos ir toliau veiks, o JVM neišsijungs.
Išjungimo procesą galima atlikti šiais trimis būdais:
- išjungimo() metodas
- shutdownNow() metodas
- awaitTermination() metodas