logo

Java ExecutorService

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.

Java ExecutorService

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.
ListainvokeAll(Collectionuppgifter) 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.
ListainvokeAll(Collectionuppgifter, lång timeout, TimeUnit-enhet) 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(Collectionuppgifter) 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(Collectionuppgifter, 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:

Java ExecutorService

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(Collectionuppgifter)
  • invokeAll(Collectionuppgifter)

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 &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 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 &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 

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