Јава ЕкецуторСервице је интерфејс који нам омогућава да извршавамо задатке на нитима асинхроно. Јава ЕкецуторСервице интерфејс је присутан у пакету јава.утил.цонцуррент. ЕкецуторСервице помаже у одржавању скупа нити и додељује им задатке. Такође пружа могућност стављања задатака у ред док не буде доступна слободна нит ако је број задатака већи од доступних нити.
Методе Јава ЕкецуторСервице
Метод | Опис |
---|---|
боолеан аваитТерминатион (дуго временско ограничење, јединица ТимеУнит) | Овај метод блокира задатак да уђе у ЕкецуторСервице све док се сви задаци не заврше након захтева за гашењем, или док не наступи дато временско ограничење, или док се тренутна нит не прекине, шта год се прво догоди. |
Листа | Овај метод извршава листу задатих задатака и враћа листу будућности која садржи резултате свих задатака када се заврше. |
Листа | Овај метод извршава листу датих задатака и враћа листу будућих послова који садрже резултате свих задатака када се заврше или истекне временско ограничење, шта год се прво догоди. |
Т инвокеАни(колекција extends Callable>задаци) | Овај метод извршава листу датих задатака и враћа резултат једног задатка који се завршава без икаквог изузетка. |
Т инвокеАни(колекција extends Callable>задаци, дуго временско ограничење, јединица ТимеУнит) | Овај метод извршава листу задатих задатака и враћа резултат једног задатка који се завршава без избацивања изузетака пре него што истекне временско ограничење. |
боолеан исСхутдовн() | Овај метод враћа да ли је дати извршилац искључен или не. |
боолеан исТерминатед() | Овај метод враћа труе ако су сви задаци извршени након искључивања. |
воид схутдовн() | Овај метод омогућава довршавање претходно послатих задатака ЕкецуторСервице-у и не дозвољава прихватање других задатака. |
Лист схутдовнНов() | Овај метод зауставља све задатке који се активно извршавају, зауставља извршавање задатака у реду чекања и враћа листу задатака који су стављени у ред чекања. |
Будућа предаја (задатак који се може позвати) | Овај метод шаље задатак који враћа вредност на извршење и враћа будућност, која представља резултат задатка на чекању. |
Будућа предаја (задатак који се може покренути) | Овај метод шаље задатак на извршење и враћа Футуре који представља тај задатак. Враћа нулл након успешног завршетка. |
Будућа предаја (задатак који се може покренути, Т резултат) | Овај метод шаље задатак на извршење и враћа Футуре који представља тај задатак. |
Једноставан програм Јава ЕкецуторСервице
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(); } }
Излаз:
У овом програму креирамо ЕкецуторСервице са десет нити и додељујемо му анонимну изводљиву имплементацију која обавља задатак да одштампа 'ЕкецуторСервице' и након што се његов задатак заврши, гасимо извршни сервис.
Како користити Јава ЕкецуторСервице
Инстанцирање ЕкецуторСервице
Можемо да користимо Јава ЕкецуторСервице да креирамо једну нит, скуп нити или планирани скуп нити. Класа Екецуторс обезбеђује фабричке методе за инстанцирање ЕкецуторСервице-а на следећи начин:
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.
Додељивање задатака ЕкецуторСервицес
Да бисмо доделили задатак ЕкецуторСервицеу, можемо користити следеће методе-
- изврши (задатак који се може покренути)
- пошаљи (задатак који се може покренути) / послати (задатак који се може позвати)
- инвокеАни(колекција extends Callable>задаци)
- инвокеАлл(колекција extends Callable>задаци)
Пример додељивања задатка ЕкецуторСервице помоћу методе екецуте().
Метода екецуте() Јава ЕкецуторСервице узима покретни објекат и обавља свој задатак асинхроно. Након позивања методе за извршавање, позивамо методу схутдовн, која блокира било који други задатак у реду чекања у екецуторСервице.
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(); } }
Излаз:
ExecutorService
Пример додељивања задатка ЕкецуторСервице-у помоћу субмит()
Субмит() метода узима објекат који се може покренути и враћа Футуре објекат. Овај објекат се касније користи за проверу статуса Руннабле-а да ли је завршио извршење или не.
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'); } }); } }
Пример додељивања задатка ЕкецуторСервице помоћу методе инвокеАни().
Метода инвокеАни() узима колекцију Цаллабле објеката или објеката класа које имплементирају Цаллабле. Овај метод враћа будући објекат објекта који се може позвати који се први успешно извршава.
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>
Излаз:
result = Task 1
Резултат складишти Задатак 1 као први објекат који се може позвати први успешно извршен.
Пример додељивања задатка ЕкецуторСервице помоћу методе инвокеАлл().
Метода инвокеАлл() преузима колекцију објеката који се могу позивати који имају задатке и враћа листу будућих објеката који садрже резултат свих задатака.
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>
Излаз:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Како искључити ЕкецуторСервице
Када завршимо са нашим задацима датим ЕкецуторСервицеу, онда морамо да га искључимо јер ЕкецуторСервице извршава задатак на различитим нитима. Ако не искључимо ЕкецуторСервице, нити ће наставити да раде, а ЈВМ се неће искључити.
Процес гашења се може обавити на следећа три метода-
- схутдовн() метода
- схутдовнНов() метода
- аваитТерминатион() метода