logo

Java ExecutorService

Java ExecutorService je vmesnik, ki nam omogoča asinhrono izvajanje nalog v nitih. Vmesnik Java ExecutorService je prisoten v paketu java.util.concurrent. ExecutorService pomaga pri vzdrževanju skupine niti in jim dodeljuje naloge. Zagotavlja tudi možnost postavljanja opravil v čakalno vrsto, dokler ni na voljo prosta nit, če je število opravil večje od razpoložljivih niti.

Java ExecutorService

Metode Java ExecutorService

Metoda Opis
boolean awaitTermination(dolga časovna omejitev, enota TimeUnit) Ta metoda blokira nalogo za vstop v ExecutorService, dokler niso dokončane vse naloge po zahtevi za zaustavitev ali dokler ne nastopi dana časovna omejitev ali se trenutna nit prekine, kar se zgodi prej.
SeznaminvokeAll(Zbirkanaloge) Ta metoda izvede seznam danih nalog in vrne seznam terminskih pogodb, ki vsebujejo rezultate vseh nalog, ko so dokončane.
SeznaminvokeAll(Zbirkaopravila, dolga časovna omejitev, enota TimeUnit) Ta metoda izvede seznam danih opravil in vrne seznam terminskih pogodb, ki vsebujejo rezultate vseh opravil, ko so dokončana ali poteče časovna omejitev, kar nastopi prej.
T invokeAny(Collectionnaloge) Ta metoda izvede seznam danih nalog in vrne rezultat ene naloge, ki je dokončana, ne da bi sprožila kakršno koli izjemo.
T invokeAny(Collectionopravila, dolga časovna omejitev, enota časovne enote) Ta metoda izvede seznam danih nalog in vrne rezultat ene naloge, ki se zaključi, ne da bi sprožila kakršno koli izjemo, preden poteče časovna omejitev.
logično isShutdown() Ta metoda vrne, ali je dani izvajalec zaustavljen ali ne.
boolean isTerminated() Ta metoda vrne true, če so se vsa opravila po zaustavitvi izvedla.
void shutdown() Ta metoda omogoča dokončanje predhodno poslanih nalog ExecutorService in ne dovoljuje sprejema nobenih drugih nalog.
Izklopi seznam zdaj() Ta metoda ustavi vsa opravila, ki se aktivno izvajajo, ustavi izvajanje opravil v čakalni vrsti in vrne seznam opravil, ki so v čakalni vrsti.
Prihodnja oddaja (priklicna naloga) Ta metoda predloži nalogo, ki vrača vrednost, v izvedbo in vrne prihodnost, ki predstavlja čakajoči rezultat naloge.
Prihodnja oddaja (izvedljiva naloga) Ta metoda predloži nalogo v izvedbo in vrne prihodnost, ki predstavlja to nalogo. Po uspešnem zaključku vrne vrednost null.
Prihodnja oddaja (izvedljivo opravilo, rezultat T) Ta metoda predloži nalogo v izvedbo in vrne prihodnost, ki predstavlja to nalogo.

Preprost 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(); } } 

Izhod:

Java ExecutorService

V tem programu ustvarimo ExecutorService z desetimi nitmi in ji dodelimo anonimno zagonsko izvedbo, ki izvede nalogo za tiskanje 'ExecutorService' in po končani nalogi zaustavimo izvajalsko storitev.

Kako uporabljati Java ExecutorService

Instanciranje ExecutorService

Java ExecutorService lahko uporabimo za ustvarjanje posamezne niti, skupine niti ali načrtovane skupine niti. Razred Executors zagotavlja tovarniške metode za instanciranje ExecutorService, kot sledi-

 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. 

Dodeljevanje nalog ExecutorServices

Za dodelitev naloge ExecutorService lahko uporabimo naslednje metode-

  • izvedba (zagonsko opravilo)
  • oddaj (izvedljivo opravilo) / oddaj (priklicno opravilo)
  • invokeAny(Zbirkanaloge)
  • invokeAll(Zbirkanaloge)

Primer dodeljevanja naloge ExecutorService z uporabo metode execute().

Metoda execute() storitve Java ExecutorService sprejme zagonski objekt in svojo nalogo izvede asinhrono. Ko izvedemo klic za izvedbo metode, pokličemo zaustavitveno metodo, ki blokira katero koli drugo nalogo v čakalni vrsti 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(); } } 

Izhod:

 ExecutorService 

Primer dodeljevanja opravila ExecutorService z uporabo submit()

Metoda submit() sprejme objekt, ki ga je mogoče izvajati, in vrne objekt Future. Ta objekt se kasneje uporabi za preverjanje statusa Runnable, ali je dokončal izvajanje ali 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'); } }); } } 

Primer dodeljevanja naloge ExecutorService z uporabo metode invokeAny().

Metoda invokeAny() sprejme zbirko objektov Callablle ali objektov razredov, ki izvajajo Callable. Ta metoda vrne prihodnji objekt klicaljivega objekta, ki se prvi uspešno izvede.

 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>

Izhod:

 result = Task 1 

Rezultat shrani nalogo 1 kot prvi objekt, ki ga je mogoče priklicati, in je najprej uspešno izveden.

Primer dodeljevanja naloge ExecutorService z uporabo metode invokeAll().

Metoda invokeAll() sprejme zbirko predmetov, ki jih je mogoče klicati in imajo naloge, in vrne seznam prihodnjih objektov, ki vsebuje rezultate vseh nalog.

 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>

Izhod:

 future.get = Task 1 future.get = Task 3 future.get = Task 2 

Kako zaustaviti ExecutorService

Ko končamo z nalogami, ki smo jih dali ExecutorService, ga moramo zaustaviti, ker ExecutorService izvaja nalogo v različnih nitih. Če ne zaustavimo ExecutorService, bodo niti še naprej delovale in JVM se ne bo zaustavil.

Postopek zaustavitve je mogoče izvesti na naslednje tri načine:

  • metoda shutdown().
  • metoda shutdownNow().
  • metoda awaitTermination().