Java ExecutorService je rozhraní, které nám umožňuje provádět úlohy na vláknech asynchronně. Rozhraní Java ExecutorService je přítomno v balíčku java.util.concurrent. ExecutorService pomáhá udržovat fond vláken a přiděluje jim úkoly. Poskytuje také možnost zařadit úlohy do fronty, dokud nebude k dispozici volné vlákno, pokud je počet úloh větší než počet dostupných vláken.
stromová mapa
Metody Java ExecutorService
Metoda | Popis |
---|---|
booleovské čekání na ukončení (dlouhý časový limit, jednotka TimeUnit) | Tato metoda blokuje zadání úlohy do ExecutorService, dokud nejsou všechny úlohy dokončeny po požadavku na vypnutí nebo dokud nedojde k danému časovému limitu nebo dokud není přerušeno aktuální vlákno, podle toho, co nastane dříve. |
Seznam | Tato metoda provede seznam zadaných úkolů a po dokončení vrátí seznam Futures, který obsahuje výsledky všech úkolů. |
Seznam | Tato metoda provede seznam zadaných úkolů a vrátí seznam Futures, který obsahuje výsledky všech úkolů po dokončení nebo vypršení časového limitu, podle toho, co nastane dříve. |
T invokeAny(Collection extends Callable>úkoly) | Tato metoda provede seznam zadaných úkolů a vrátí výsledek jednoho úkolu, který je dokončen bez vyvolání jakékoli výjimky. |
T invokeAny(Collection extends Callable>úkoly, dlouhý časový limit, jednotka TimeUnit) | Tato metoda provede seznam zadaných úkolů a vrátí výsledek jednoho úkolu, který je dokončen bez vyvolání jakékoli výjimky před uplynutím časového limitu. |
boolean isShutdown() | Tato metoda vrací, zda je daný exekutor vypnutý nebo ne. |
boolean isTerminated() | Tato metoda vrátí hodnotu true, pokud byly po vypnutí provedeny všechny úlohy. |
void shutdown() | Tato metoda umožňuje dokončení dříve odevzdaných úkolů ExecutorService a neumožňuje přijímat žádné jiné úkoly. |
Seznam vypnutíNyní() | Tato metoda zastaví všechny aktivně prováděné úlohy, zastaví provádění úloh ve frontě a vrátí seznam úloh, které jsou ve frontě. |
Budoucí odeslání (úkol s možností volání) | Tato metoda odešle k provedení úlohu vracející hodnotu a vrátí budoucnost, která představuje čekající výsledek úlohy. |
Budoucí odeslání (spustitelný úkol) | Tato metoda odešle úkol k provedení a vrátí budoucnost představující tento úkol. Po úspěšném dokončení vrátí hodnotu null. |
Budoucí odeslání (spustitelný úkol, výsledek T) | Tato metoda odešle úkol k provedení a vrátí budoucnost představující tento úkol. |
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ýstup:
V tomto programu vytváříme ExecutorService s deseti vlákny a přiřazujeme jí anonymní spustitelnou implementaci, která provede úlohu vytisknout 'ExecutorService' a po jejím dokončení službu exekutor vypneme.
Jak používat Java ExecutorService
Instanciating ExecutorService
Java ExecutorService můžeme použít k vytvoření jednoho vlákna, fondu vláken nebo plánovaného fondu vláken. Třída Executors poskytuje tovární metody pro vytvoření instance ExecutorService následovně-
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.
Přidělování úkolů ExecutorServices
K přiřazení úkolu ExecutorService můžeme použít následující metody-
- spustit (spustitelná úloha)
- odeslat (spustitelná úloha) / odeslat (vyvolatelná úloha)
- invokeAny(Collection extends Callable>úkoly)
- invokeAll(Collection extends Callable>úkoly)
Příklad přiřazení úkolu ExecutorService pomocí metody execute().
srovnatelné rozhraní v Javě
Metoda execute() Java ExecutorService přijímá spustitelný objekt a provádí svůj úkol asynchronně. Po provedení volání metody spuštění zavoláme metodu vypnutí, která zablokuje jakoukoli jinou úlohu, která se má zařadit do fronty 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ýstup:
ExecutorService
Příklad přiřazení úkolu ExecutorService pomocí submit()
Metoda submit() přebírá spustitelný objekt a vrací budoucí objekt. Tento objekt se později používá ke kontrole stavu Runnable, zda dokončil provádění nebo 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'); } }); } }
Příklad přiřazení úkolu ExecutorService pomocí metody invokeAny()
Metoda invokeAny() bere kolekci objektů Callable nebo objektů tříd implementujících Callable. Tato metoda vrací budoucí objekt volatelného objektu, který se úspěšně provede jako první.
0,06 jako zlomek
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ýstup:
mediální přenos
result = Task 1
Výsledek uloží úlohu 1, protože první volatelný objekt je úspěšně proveden jako první.
Příklad přiřazení úkolu ExecutorService pomocí metody invokeAll().
Metoda invokeAll() převezme kolekci Callable objektů s úkoly a vrátí seznam budoucích objektů obsahující výsledek všech úkolů.
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ýstup:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Jak vypnout ExecutorService
Jakmile skončíme s našimi úkoly přidělenými ExecutorService, musíme jej vypnout, protože ExecutorService provádí úkol v různých vláknech. Pokud nevypneme ExecutorService, vlákna poběží dál a JVM se nevypne.
Proces vypnutí lze provést následujícími třemi způsoby:
- metoda shutdown().
- metoda shutdownNow().
- metoda waitTermination().