Java ExecutorService är gränssnittet som tillåter oss att utföra uppgifter på trådar asynkront. Java ExecutorService-gränssnittet finns i paketet java.util.concurrent. ExecutorService hjälper till att underhålla en pool av trådar och tilldelar dem uppgifter. Det ger också möjlighet att köa uppgifter tills det finns en ledig tråd tillgänglig om antalet uppgifter är fler än de tillgängliga trådarna.
Metoder för Java ExecutorService
Metod | Beskrivning |
---|---|
boolesk awaitTermination (lång timeout, tidsenhet) | Den här metoden blockerar uppgiften att gå in i ExecutorService tills alla uppgifter har slutförts efter avstängningsbegäran, eller den givna timeouten inträffar eller den aktuella tråden avbryts, beroende på vilket som inträffar först. |
Lista | Denna metod exekverar listan över uppgifter som ges och returnerar listan över Futures som innehåller resultaten av alla uppgifter när de är klara. |
Lista | Denna metod exekverar listan över givna uppgifter och returnerar listan över Futures som innehåller resultaten av alla uppgifter när de är klara eller timeouten löper ut, beroende på vilket som inträffar först. |
T invokeAny(Collection extends Callable>uppgifter) | Denna metod exekverar listan över givna uppgifter och returnerar resultatet av en uppgift som slutförs utan att göra något undantag. |
T invokeAny(Collection extends Callable>uppgifter, lång timeout, TimeUnit-enhet) | Den här metoden exekverar listan över givna uppgifter och returnerar resultatet av en uppgift som slutförs utan att göra något undantag innan timeouten löper ut. |
boolean isShutdown() | Denna metod returnerar om den givna executorn stängs av eller inte. |
boolean isTerminated() | Denna metod returnerar sant om alla uppgifter har körts efter avstängning. |
void shutdown() | Denna metod tillåter slutförande av tidigare inlämnade uppgifter till ExecutorService och tillåter inte att några andra uppgifter accepteras. |
List shutdownNow() | Denna metod stoppar alla aktivt exekverande uppgifter, stoppar exekveringen av köade uppgifter och returnerar listan över uppgifter som köar. |
Framtida inlämning (uppringningsbar uppgift) | Denna metod skickar en värdereturnerande uppgift för exekvering och returnerar framtiden, som representerar det väntande resultatet av uppgiften. |
Framtida inlämning (körbar uppgift) | Denna metod skickar en uppgift för exekvering och returnerar en framtid som representerar den uppgiften. Den returneras null efter framgångsrikt slutförande. |
Framtida inlämning (körbar uppgift, T-resultat) | Denna metod skickar en uppgift för exekvering och returnerar en framtid som representerar den uppgiften. |
Ett enkelt program för 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:
I det här programmet skapar vi en ExecutorService med tio trådar och tilldelar den en anonym körbar implementering som utför en uppgift för att skriva ut 'ExecutorService' och efter att dess uppgift är över stänger vi av executortjänsten.
Hur man använder Java ExecutorService
Instantierar ExecutorService
Vi kan använda Java ExecutorService för att skapa en enda tråd, en pool av trådar eller en schemalagd pool av trådar. Klassen Executors tillhandahåller fabriksmetoder för att instansiera en ExecutorService enligt följande-
python-program för binär sökning
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.
Tilldela uppgifter till ExecutorServices
För att tilldela en uppgift till ExecutorService kan vi använda följande metoder-
- exekvera (körbar uppgift)
- submit(Körbar uppgift) / submit(Callable task)
- invokeAny(Collection extends Callable>uppgifter)
- invokeAll(Collection extends Callable>uppgifter)
Exempel på att tilldela en uppgift till ExecutorService med metoden execute().
ta bort sista tecknet från strängen
Java ExecutorServices execute()-metod tar in ett körbart objekt och utför dess uppgift asynkront. Efter att ha gjort call to execute-metoden anropar vi shutdown-metoden, som blockerar alla andra uppgifter att köa 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
Exempel på att tilldela en uppgift till ExecutorService med submit()
Metoden submit() tar in ett körbart objekt och returnerar ett Future-objekt. Detta objekt används senare för att kontrollera statusen för Runnable oavsett om det har slutförts eller inte.
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'); } }); } }
Exempel på att tilldela en uppgift till ExecutorService med metoden invokeAny().
Metoden invokeAny() tar en samling Callablle-objekt eller objekt av klasser som implementerar Callable. Denna metod returnerar det framtida objektet för det anropsbara objektet som exekveras framgångsrikt först.
list.sort java
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>
Produktion:
result = Task 1
Resultatet lagrar uppgift 1 eftersom det första anropsbara objektet exekveras framgångsrikt först.
Exempel på att tilldela en uppgift till ExecutorService med metoden invokeAll().
javascript för dropdown
Metoden invokeAll() tar in en samling anropbara objekt med uppgifter och returnerar en lista med framtida objekt som innehåller resultatet av alla uppgifter.
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>
Produktion:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Hur man stänger av ExecutorService
När vi är klara med våra uppgifter som getts till ExecutorService måste vi stänga av den eftersom ExecutorService utför uppgiften på olika trådar. Om vi inte stänger av ExecutorService kommer trådarna att fortsätta köra och JVM kommer inte att stängas av.
Processen att stänga av kan göras på följande tre metoder-
- shutdown() metod
- shutdownNow()-metoden
- awaitTermination() metod