logo

Java ExecutorService

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.

Java ExecutorService

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.
ListainvokeAll(Gyűjteményfeladatok) 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.
ListainvokeAll(Gyűjteményfeladatok, hosszú időtúllépés, TimeUnit egység) 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ényfeladatok) 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ényfeladatok, 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:

Java ExecutorService

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ényfeladatok)
  • invokeAll(Gyűjteményfeladatok)

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 &apos;Task 1&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 2&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 3&apos;; } }); String result = executorService.invokeAny(callables); System.out.println(&apos;result = &apos; + 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 &apos;Task 1&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 2&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 3&apos;; } }); java.util.List<future> futures = executorService.invokeAll(callables); for(Future future : futures){ System.out.println(&apos;future.get = &apos; + 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