logo

Java ExecutorService

Java ExecutorService er grænsefladen, som giver os mulighed for at udføre opgaver på tråde asynkront. Java ExecutorService-grænsefladen er til stede i pakken java.util.concurrent. ExecutorService hjælper med at vedligeholde en pulje af tråde og tildeler dem opgaver. Det giver også mulighed for at stille opgaver i kø, indtil der er en ledig tråd tilgængelig, hvis antallet af opgaver er mere end de tilgængelige tråde.

Java ExecutorService

Metoder til Java ExecutorService

Metode Beskrivelse
boolesk awaitTermination (lang timeout, TimeUnit-enhed) Denne metode blokerer opgaven til at gå ind i ExecutorService, indtil alle opgaverne er fuldført efter nedlukningsanmodningen, eller den givne timeout opstår, eller den aktuelle tråd afbrydes, alt efter hvad der sker først.
ListeinvokeAll(Samlingopgaver) Denne metode udfører listen over givne opgaver og returnerer listen over Futures, som indeholder resultaterne af alle opgaverne, når de er afsluttet.
ListeinvokeAll(Samlingopgaver, lang timeout, TimeUnit-enhed) Denne metode udfører listen over givne opgaver og returnerer listen over Futures, som indeholder resultaterne af alle opgaver, når de er afsluttet eller timeout udløber, alt efter hvad der indtræffer først.
T invokeAny(Collectionopgaver) Denne metode udfører listen over givne opgaver og returnerer resultatet af en opgave, som bliver fuldført uden at kaste nogen undtagelse.
T invokeAny(Collectionopgaver, lang timeout, TimeUnit-enhed) Denne metode udfører listen over givne opgaver og returnerer resultatet af én opgave, som bliver fuldført uden at kaste nogen undtagelse, før timeout udløber.
boolean isShutdown() Denne metode returnerer, om den givne executor er lukket ned eller ej.
boolesk erTerminated() Denne metode returnerer sand, hvis alle opgaver er udført efter nedlukning.
ugyldig shutdown() Denne metode tillader færdiggørelse af tidligere indsendte opgaver til ExecutorService og tillader ikke, at andre opgaver accepteres.
Liste shutdownNow() Denne metode stopper alle aktivt udførende opgaver, stopper udførelsen af ​​opgaver i kø og returnerer listen over opgaver, der er i kø.
Fremtidig indsendelse (opkaldbar opgave) Denne metode sender en værdi-returnerende opgave til udførelse og returnerer fremtiden, som repræsenterer det afventende resultat af opgaven.
Fremtidig indsendelse (kørbar opgave) Denne metode sender en opgave til udførelse og returnerer en fremtid, der repræsenterer denne opgave. Det returnerer null ved vellykket afslutning.
Fremtidig indsendelse (Kørbar opgave, T-resultat) Denne metode sender en opgave til udførelse og returnerer en fremtid, der repræsenterer denne opgave.

Et simpelt program af 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(); } } 

Produktion:

homogen blanding
Java ExecutorService

I dette program opretter vi en ExecutorService med ti tråde og tildeler den en anonym kørselsimplementering, som udfører en opgave for at udskrive 'ExecutorService', og efter dens opgave er overstået, lukker vi executor-tjenesten ned.

Sådan bruger du Java ExecutorService

Instantiating ExecutorService

Vi kan bruge Java ExecutorService til at oprette en enkelt tråd, en pool af tråde eller en planlagt pool af tråde. Executors-klassen giver fabriksmetoder til at instansiere en ExecutorService som følger-

 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. 

Tildeling af opgaver til ExecutorServices

For at tildele en opgave til ExecutorService kan vi bruge følgende metoder-

  • execute (kørbar opgave)
  • submit(Kørbar opgave) / submit(Opkaldbar opgave)
  • invokeAny(Collectionopgaver)
  • invokeAll(Samlingopgaver)

Eksempel på tildeling af en opgave til ExecutorService ved hjælp af execute()-metoden

Java ExecutorServices execute()-metode tager et kørselbart objekt ind og udfører dets opgave asynkront. Efter at have foretaget opkaldet til execute-metoden, kalder vi shutdown-metoden, som blokerer enhver anden opgave for at stå i kø i 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(); } } 

Produktion:

 ExecutorService 

Eksempel på tildeling af en opgave til ExecutorService ved hjælp af submit()

Submit()-metoden tager et kørselbart objekt ind og returnerer et Future-objekt. Dette objekt bruges senere til at kontrollere status for Runnable, uanset om det har fuldført eksekvering eller ej.

 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'); } }); } } 

Eksempel på tildeling af en opgave til ExecutorService ved hjælp af metoden invokeAny().

strengmetoder i java

Metoden invokeAny() tager en samling af Callablle-objekter eller objekter af klasser, der implementerer Callable. Denne metode returnerer det fremtidige objekt for det kaldbare objekt, som bliver udført først.

 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>

Produktion:

 result = Task 1 

Resultatet gemmer opgave 1, da det første kaldbare objekt udføres først.

Eksempel på tildeling af en opgave til ExecutorService ved hjælp af metoden invokeAll().

Metoden invokeAll() tager en samling af Callable-objekter med opgaver ind og returnerer en liste over Future-objekter, der indeholder resultatet af alle opgaverne.

 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>

Produktion:

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

Sådan lukker du ExecutorService

Når vi er færdige med vores opgaver givet til ExecutorService, så er vi nødt til at lukke den ned, fordi ExecutorService udfører opgaven på forskellige tråde. Hvis vi ikke lukker ExecutorService, vil trådene blive ved med at køre, og JVM'en lukker ikke ned.

Processen med at lukke ned kan udføres på følgende tre metoder-

  • shutdown() metode
  • shutdownNow() metode
  • awaitTermination() metode