De Java ExecutorService is de interface waarmee we taken op threads asynchroon kunnen uitvoeren. De Java ExecutorService-interface is aanwezig in het java.util.concurrent-pakket. De ExecutorService helpt bij het onderhouden van een pool van threads en wijst deze taken toe. Het biedt ook de mogelijkheid om taken in de wachtrij te plaatsen totdat er een vrije thread beschikbaar is als het aantal taken groter is dan de beschikbare threads.
Methoden van Java ExecutorService
Methode | Beschrijving |
---|---|
boolean awaitTermination(lange time-out, TimeUnit-eenheid) | Deze methode blokkeert de taak om ExecutorService binnen te gaan totdat alle taken zijn voltooid na het afsluitverzoek, of de gegeven time-out optreedt, of de huidige thread wordt onderbroken, afhankelijk van wat zich het eerst voordoet. |
Lijst | Deze methode voert de lijst met gegeven taken uit en retourneert de lijst met Futures die de resultaten van alle taken bevatten wanneer ze zijn voltooid. |
Lijst | Deze methode voert de lijst met gegeven taken uit en retourneert de lijst met Futures die de resultaten van alle taken bevatten wanneer ze zijn voltooid of de time-out is verstreken, afhankelijk van wat zich het eerst voordoet. |
T invokeAny(Verzameling extends Callable>taken) | Deze methode voert de lijst met gegeven taken uit en retourneert het resultaat van één taak die wordt voltooid zonder enige uitzondering. |
T invokeAny(Verzameling extends Callable>taken, lange time-out,TimeUnit-eenheid) | Deze methode voert de lijst met opgegeven taken uit en retourneert het resultaat van één taak die wordt voltooid zonder enige uitzondering voordat de time-out is verstreken. |
booleaanse waarde isShutdown() | Deze methode retourneert of de gegeven uitvoerder is afgesloten of niet. |
boolean isTerminate() | Deze methode retourneert true als alle taken zijn uitgevoerd na het afsluiten. |
ongeldig afsluiten() | Met deze methode kunnen eerder ingediende taken bij de ExecutorService worden voltooid en kunnen geen andere taken worden geaccepteerd. |
Lijst shutdownNow() | Deze methode stopt alle actief uitgevoerde taken, stopt de uitvoering van taken in de wachtrij en retourneert de lijst met taken die in de wachtrij staan. |
Toekomstige indiening (oproepbare taak) | Deze methode verzendt een waarde-retournerende taak voor uitvoering en retourneert de Future, die het hangende resultaat van de taak vertegenwoordigt. |
Toekomstige indiening (uitvoerbare taak) | Deze methode dient een taak in voor uitvoering en retourneert een Future die die taak vertegenwoordigt. Het retourneert nul na succesvolle voltooiing. |
Toekomstige indiening (uitvoerbare taak, T-resultaat) | Deze methode dient een taak in voor uitvoering en retourneert een Future die die taak vertegenwoordigt. |
Een eenvoudig programma van 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(); } }
Uitgang:
In dit programma creëren we een ExecutorService met tien threads en wijzen er een anonieme, uitvoerbare implementatie aan toe die een taak uitvoert om 'ExecutorService' af te drukken en nadat de taak voorbij is, sluiten we de executorservice af.
Java ExecutorService gebruiken
ExecutorService instantiëren
We kunnen Java ExecutorService gebruiken om een enkele thread, een pool van threads of een geplande pool van threads te maken. De klasse Executors biedt fabrieksmethoden om een ExecutorService als volgt te instantiëren:
char en int java
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.
Taken toewijzen aan ExecutorServices
Om een taak aan ExecutorService toe te wijzen, kunnen we de volgende methoden gebruiken:
- uitvoeren (uitvoerbare taak)
- indienen (uitvoerbare taak) / indienen (oproepbare taak)
- invokeAny(verzameling extends Callable>taken)
- invokeAll(verzameling extends Callable>taken)
Voorbeeld van het toewijzen van een taak aan ExecutorService met behulp van de execute()-methode
a-b snoeien
De methode execute() van de Java ExecutorService neemt een uitvoerbaar object op en voert zijn taak asynchroon uit. Na het aanroepen van de execute-methode, roepen we de shutdown-methode aan, die elke andere taak blokkeert die in de wachtrij moet staan in de 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(); } }
Uitgang:
ExecutorService
Voorbeeld van het toewijzen van een taak aan ExecutorService met behulp van submission()
De methode submission() neemt een uitvoerbaar object op en retourneert een Future-object. Dit object wordt later gebruikt om de status van Runnable te controleren, of de uitvoering ervan is voltooid of niet.
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'); } }); } }
Voorbeeld van het toewijzen van een taak aan ExecutorService met behulp van de methode invokeAny().
De methode invokeAny() gebruikt een verzameling Callablle-objecten of objecten van klassen die Callable implementeren. Deze methode retourneert het toekomstige object van het opvraagbare object dat als eerste met succes wordt uitgevoerd.
Sara Ali Khan leeftijd
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>
Uitgang:
result = Task 1
Het resultaat slaat taak 1 op, aangezien het eerste opvraagbare object als eerste met succes wordt uitgevoerd.
Voorbeeld van het toewijzen van een taak aan ExecutorService met behulp van de methode invokeAll().
volgorde op willekeurige sql
De methode invokeAll() neemt een verzameling opvraagbare objecten met taken op en retourneert een lijst met toekomstige objecten met het resultaat van alle taken.
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>
Uitgang:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Hoe u ExecutorService afsluit
Zodra we klaar zijn met onze taken die aan ExecutorService zijn gegeven, moeten we deze afsluiten omdat ExecutorService de taak op verschillende threads uitvoert. Als we de ExecutorService niet afsluiten, blijven de threads actief en wordt de JVM niet afgesloten.
Het proces van afsluiten kan op de volgende drie manieren worden uitgevoerd:
- shutdown()-methode
- shutdownNow()-methode
- waitTermination() methode