Java ExecutorService er grensesnittet som lar oss utføre oppgaver på tråder asynkront. Java ExecutorService-grensesnittet finnes i pakken java.util.concurrent. ExecutorService hjelper til med å vedlikeholde en samling av tråder og tildeler dem oppgaver. Det gir også mulighet for å stille oppgaver i kø til det er en ledig tråd tilgjengelig hvis antall oppgaver er flere enn tilgjengelige tråder.
Metoder for Java ExecutorService
Metode | Beskrivelse |
---|---|
boolsk awaitTermination (lang tidsavbrudd, tidsenhet) | Denne metoden blokkerer oppgaven for å gå inn i ExecutorService inntil alle oppgavene er fullført etter avslutningsforespørselen, eller det gitte tidsavbruddet inntreffer, eller den gjeldende tråden blir avbrutt, avhengig av hva som skjer først. |
Liste | Denne metoden utfører listen over gitte oppgaver og returnerer listen over Futures som inneholder resultatene av alle oppgavene når de er fullført. |
Liste | Denne metoden utfører listen over gitte oppgaver og returnerer listen over Futures som inneholder resultatene av alle oppgavene når de er fullført eller tidsavbruddet utløper, avhengig av hva som inntreffer først. |
T invokeAny(Collection extends Callable>oppgaver) | Denne metoden utfører listen over oppgavene som er gitt og returnerer resultatet av en oppgave som blir fullført uten å gi noe unntak. |
T invokeAny(Collection extends Callable>oppgaver, lang tidsavbrudd, TimeUnit-enhet) | Denne metoden utfører listen over gitte oppgaver og returnerer resultatet av en oppgave som fullføres uten å kaste noe unntak før tidsavbruddet går ut. |
boolsk isShutdown() | Denne metoden returnerer om den gitte eksekveren er stengt eller ikke. |
boolsk erTerminated() | Denne metoden returnerer sann hvis alle oppgaver er utført etter avslutning. |
void shutdown() | Denne metoden tillater fullføring av tidligere innsendte oppgaver til ExecutorService og tillater ikke at andre oppgaver godtas. |
ListeavslutningNå() | Denne metoden stopper alle aktivt utførende oppgaver, stopper utførelsen av oppgaver i kø, og returnerer listen over oppgaver som er i kø. |
Fremtidig innsending (oppringbar oppgave) | Denne metoden sender inn en verdi-returnerende oppgave for utførelse og returnerer fremtiden, som representerer det ventende resultatet av oppgaven. |
Fremtidig innsending (kjørbar oppgave) | Denne metoden sender inn en oppgave for utførelse og returnerer en fremtid som representerer den oppgaven. Den returnerer null ved vellykket gjennomføring. |
Fremtidig innsending (Kjørbar oppgave, T-resultat) | Denne metoden sender inn en oppgave for utførelse og returnerer en fremtid som representerer den oppgaven. |
Et enkelt program for 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(); } }
Produksjon:
sdlc
I dette programmet lager vi en ExecutorService med ti tråder og tildeler den en anonym kjørbar implementering som utfører en oppgave for å skrive ut 'ExecutorService' og etter at oppgaven er over, stenger vi executor-tjenesten.
Hvordan bruke Java ExecutorService
Instantiating ExecutorService
Vi kan bruke Java ExecutorService til å lage en enkelt tråd, en pool av tråder eller en planlagt pool av tråder. Executors-klassen gir fabrikkmetoder for å 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.
Tilordne oppgaver til ExecutorServices
For å tilordne en oppgave til ExecutorService, kan vi bruke følgende metoder-
- execute (kjørbar oppgave)
- submit(Kjørbar oppgave) / submit(Kjørbar oppgave)
- invokeAny(Collection extends Callable>oppgaver)
- invokeAll(Samling extends Callable>oppgaver)
Eksempel på å tilordne en oppgave til ExecutorService ved å bruke execute()-metoden
Java ExecutorServices execute()-metode tar inn et kjørbart objekt og utfører oppgaven asynkront. Etter å ha gjort call to execute-metoden, kaller vi shutdown-metoden, som blokkerer enhver annen oppgave for å 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(); } }
Produksjon:
ExecutorService
Eksempel på å tilordne en oppgave til ExecutorService ved å bruke submit()
Submit()-metoden tar inn et kjørbart objekt og returnerer et Future-objekt. Dette objektet brukes senere til å sjekke statusen til Runnable om det har fullført utførelse eller ikke.
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å å tilordne en oppgave til ExecutorService ved å bruke invokeAny()-metoden
strengmetoder i java
Metoden invokeAny() tar en samling av Callablle-objekter eller objekter av klasser som implementerer Callable. Denne metoden returnerer det fremtidige objektet til det anropbare objektet som blir utfø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 '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>
Produksjon:
result = Task 1
Resultatet lagrer oppgave 1 ettersom det første anropbare objektet er vellykket utført først.
Eksempel på å tilordne en oppgave til ExecutorService ved å bruke invokeAll()-metoden
Metoden invokeAll() tar inn en samling av anropbare objekter som har oppgaver og returnerer en liste over fremtidige objekter som inneholder resultatet av alle oppgavene.
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>
Produksjon:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Slik slår du av ExecutorService
Når vi er ferdige med oppgavene våre som er gitt til ExecutorService, må vi stenge den fordi ExecutorService utfører oppgaven på forskjellige tråder. Hvis vi ikke stenger ExecutorService, vil trådene fortsette å kjøre, og JVM vil ikke stenge.
Prosessen med å slå av kan gjøres på følgende tre metoder-
- shutdown()-metoden
- shutdownNow()-metoden
- awaitTermination()-metoden