A Java ExecutorService az a felület, amely lehetővé teszi számunkra, hogy aszinkron módon hajtsunk végre feladatokat a szálakon. A Java ExecutorService felület a java.util.concurrent csomagban található. Az ExecutorService segít karbantartani a szálak készletét, és feladatokat rendel hozzájuk. Lehetőséget biztosít a feladatok sorba állítására is, amíg egy szabad szál nem áll rendelkezésre, ha a feladatok száma meghaladja a rendelkezésre álló szálakat.
A Java ExecutorService módszerei
Módszer | Leírás |
---|---|
logikai awaitTermination (hosszú időtúllépés, időegység egység) | Ez a metódus blokkolja az ExecutorService szolgáltatásba való belépést mindaddig, amíg az összes feladat be nem fejeződik a leállítási kérés után, vagy be nem következik az adott időtúllépés, vagy az aktuális szál megszakad, attól függően, hogy melyik történik előbb. |
Lista | Ez a metódus végrehajtja a megadott feladatok listáját, és visszaadja a Futures listát, amely az összes feladat eredményét tartalmazza. |
Lista | Ez a metódus végrehajtja a megadott feladatok listáját, és visszaadja a Futures listát, amely tartalmazza az összes feladat eredményét, amikor befejeződik vagy lejár az időkorlát, attól függően, hogy melyik következik be előbb. |
T invokeAny(Gyűjtemény extends Callable>feladatok) | Ez a metódus végrehajtja a megadott feladatok listáját, és egy olyan feladat eredményét adja vissza, amely kivétel nélkül befejeződik. |
T invokeAny(Gyűjtemény extends Callable>feladatok, hosszú időtúllépés, TimeUnit egység) | Ez a metódus végrehajtja a megadott feladatok listáját, és visszaadja egy feladat eredményét, amely kivétel nélkül befejeződik az időkorlát letelte előtt. |
logikai isShutdown() | Ez a metódus visszaadja, hogy az adott végrehajtó le van-e állítva vagy sem. |
logikai érték isTerminated() | Ez a metódus igaz értéket ad vissza, ha a leállítás után minden feladat végrehajtásra került. |
érvénytelen leállítás () | Ez a módszer lehetővé teszi az ExecutorService-nek korábban elküldött feladatok elvégzését, és nem enged más feladatokat elfogadni. |
Lista shutdown Now() | Ez a módszer leállítja az összes aktívan végrehajtott feladatot, leállítja a sorba állított feladatok végrehajtását, és visszaadja a sorba állított feladatok listáját. |
Jövő beküldés (meghívható feladat) | Ez a módszer egy értékvisszaadó feladatot küld el végrehajtásra, és visszaadja a Future-t, amely a feladat függőben lévő eredményét jelenti. |
Jövő beküldés (Futtatható feladat) | Ez a metódus elküld egy feladatot végrehajtásra, és a feladatot reprezentáló jövőt ad vissza. Sikeres befejezés esetén nullát ad vissza. |
Jövő beküldés (Futtatható feladat, T eredmény) | Ez a metódus elküld egy feladatot végrehajtásra, és a feladatot reprezentáló jövőt ad vissza. |
A Java ExecutorService egyszerű programja
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(); } }
Kimenet:
Ebben a programban egy tíz szálból álló ExecutorService-t hozunk létre, és hozzárendelünk egy névtelen futtatható implementációt, amely egy feladatot hajt végre az 'ExecutorService' kinyomtatására, majd miután a feladat befejeződött, leállítjuk az végrehajtó szolgáltatást.
A Java ExecutorService használata
ExecutorService példányosítása
A Java ExecutorService segítségével létrehozhatunk egyetlen szálat, szálkészletet vagy ütemezett szálkészletet. Az Executors osztály gyári metódusokat biztosít az ExecutorService példányosításához az alábbiak szerint:
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.
Feladatok hozzárendelése az ExecutorServices-hez
Feladat hozzárendeléséhez az ExecutorService-hez a következő módszereket használhatjuk:
- végrehajt (futtatható feladat)
- benyújt (Futtatható feladat) / benyújt (Hívható feladat)
- invokeAny(Gyűjtemény extends Callable>feladatok)
- invokeAll(Gyűjtemény extends Callable>feladatok)
Példa egy feladat hozzárendelésére az ExecutorService szolgáltatáshoz az execute() metódus használatával
java veremek
A Java ExecutorService execute() metódusa bevesz egy futtatható objektumot, és aszinkron módon hajtja végre a feladatát. A call to execute metódus végrehajtása után meghívjuk a shutdown metódust, amely blokkol minden más feladatot, hogy sorba álljon az executorService-ben.
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(); } }
Kimenet:
string tömb
ExecutorService
Példa egy feladat hozzárendelésére az ExecutorService szolgáltatáshoz a submit()
A submit() metódus bevesz egy futtatható objektumot, és egy Future objektumot ad vissza. Ezt az objektumot később a Runnable állapotának ellenőrzésére használják, hogy befejezte-e a végrehajtást vagy sem.
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élda egy feladat hozzárendelésére az ExecutorService szolgáltatáshoz az invokeAny() metódus használatával
Az invokeAny() metódus Callablle objektumok gyűjteményét vagy a Callable-t megvalósító osztályok objektumait veszi fel. Ez a metódus a hívható objektum jövőbeli objektumát adja vissza, amely először sikeresen végrehajtásra kerül.
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>
Kimenet:
result = Task 1
Az eredmény az 1. feladatot tárolja, mivel az első hívható objektum sikeresen végrehajtódik először.
Példa egy feladat hozzárendelésére az ExecutorService szolgáltatáshoz az invokeAll() metódus használatával
Az invokeAll() metódus beveszi a feladatokkal rendelkező hívható objektumok gyűjteményét, és visszaadja a jövőbeli objektumok listáját, amely tartalmazza az összes feladat eredményét.
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>
Kimenet:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Az ExecutorService leállítása
Ha végeztünk az ExecutorService-nek adott feladatainkkal, akkor le kell állítani, mert az ExecutorService különböző szálakon hajtja végre a feladatot. Ha nem állítjuk le az ExecutorService-t, a szálak tovább futnak, és a JVM nem fog leállni.
25 c-től k-ig
A leállítási folyamat a következő három módszerrel hajtható végre:
- shutdown() metódus
- shutdownNow() metódus
- awaitTermination() metódus