logo

Java ExecutorService

Java ExecutorService ir saskarne, kas ļauj mums asinhroni izpildīt uzdevumus pavedienos. Java ExecutorService saskarne ir pieejama pakotnē java.util.concurrent. ExecutorService palīdz uzturēt pavedienu kopu un piešķir tiem uzdevumus. Tas arī nodrošina iespēju sastādīt uzdevumus rindā, līdz ir pieejams bezmaksas pavediens, ja uzdevumu skaits pārsniedz pieejamo pavedienu skaitu.

Java ExecutorService

Java ExecutorService metodes

Metode Apraksts
Būla awaitTermination (ilgs taimauts, laika vienība) Šī metode bloķē uzdevumu, lai ievadītu ExecutorService, līdz visi uzdevumi ir pabeigti pēc izslēgšanas pieprasījuma vai iestājas dotais taimauts, vai tiek pārtraukts pašreizējais pavediens, atkarībā no tā, kas notiek vispirms.
SarakstsinvokeAll (kolekcijauzdevumi) Šī metode izpilda doto uzdevumu sarakstu un atgriež nākotnes līgumu sarakstu, kurā ir visu uzdevumu rezultāti, kad tie ir izpildīti.
SarakstsinvokeAll (kolekcijauzdevumi, ilgs taimauts, laika vienība) Šī metode izpilda doto uzdevumu sarakstu un atgriež nākotnes līgumu sarakstu, kurā ir visu uzdevumu rezultāti, kad tie ir izpildīti vai beidzas taimauts, atkarībā no tā, kas notiek vispirms.
T invokeAny(kolekcijauzdevumi) Šī metode izpilda doto uzdevumu sarakstu un atgriež viena uzdevuma rezultātu, kas tiek izpildīts bez izņēmuma.
T invokeAny(kolekcijauzdevumi, ilgs noildze, laika vienība) Šī metode izpilda doto uzdevumu sarakstu un atgriež viena uzdevuma rezultātu, kas tiek izpildīts, neizdarot nekādus izņēmumus pirms taimauta beigām.
Būla vērtība irShutdown() Šī metode atgriež, vai dotais izpildītājs ir aizvērts vai nē.
Būla vērtība ir Terminated() Šī metode atgriež patieso vērtību, ja visi uzdevumi ir izpildīti pēc izslēgšanas.
anulēt izslēgšanu () Šī metode ļauj pabeigt iepriekš ExecutorService iesniegtos uzdevumus un neļauj pieņemt citus uzdevumus.
Saraksts shutdown Now() Šī metode aptur visus aktīvi izpildošos uzdevumus, aptur rindā esošo uzdevumu izpildi un atgriež rindā esošo uzdevumu sarakstu.
Nākotnes iesniegšana (izsaucams uzdevums) Šī metode iesniedz izpildei vērtību atgriežošu uzdevumu un atgriež nākotni, kas atspoguļo uzdevuma neapstiprināto rezultātu.
Nākotnes iesniegšana (izpildāms uzdevums) Šī metode iesniedz izpildei uzdevumu un atgriež nākotnes vērtību, kas attēlo šo uzdevumu. Pēc veiksmīgas pabeigšanas tas atgriež nulli.
Nākotnes iesniegšana (izpildāms uzdevums, T rezultāts) Šī metode iesniedz izpildei uzdevumu un atgriež nākotnes vērtību, kas attēlo šo uzdevumu.

Vienkārša Java ExecutorService programma

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

Izvade:

Java ExecutorService

Šajā programmā mēs izveidojam ExecutorService ar desmit pavedieniem un piešķiram tam anonīmu izpildāmu implementāciju, kas veic uzdevumu, lai izdrukātu 'ExecutorService', un pēc tā uzdevuma beigām mēs izslēdzam izpildītāja pakalpojumu.

Kā lietot Java ExecutorService

Instantiating ExecutorService

Mēs varam izmantot Java ExecutorService, lai izveidotu vienu pavedienu, pavedienu kopu vai ieplānotu pavedienu kopu. Izpildītāju klase nodrošina rūpnīcas metodes ExecutorService instantiancei, kā norādīts tālāk.

 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. 

Uzdevumu piešķiršana ExecutorServices

Lai piešķirtu uzdevumu ExecutorService, mēs varam izmantot šādas metodes-

  • izpildīt (izpildāms uzdevums)
  • iesniegt (izpildāms uzdevums) / iesniegt (izsaucams uzdevums)
  • invokeAny(Kolekcijauzdevumi)
  • invokeAll (kolekcijauzdevumi)

Piemērs uzdevuma piešķiršanai ExecutorService, izmantojot execute() metodi

Java ExecutorService metode execute() uzņem darbināmu objektu un veic savu uzdevumu asinhroni. Pēc izsaukšanas izpildes metodes mēs izsaucam izslēgšanas metodi, kas bloķē jebkuru citu uzdevumu, kas jāstāv rindā 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(); } } 

Izvade:

 ExecutorService 

Piemērs uzdevuma piešķiršanai ExecutorService, izmantojot submit()

Metode submit() uzņem izpildāmu objektu un atgriež nākotnes objektu. Šis objekts vēlāk tiek izmantots, lai pārbaudītu Runnable statusu, vai tas ir pabeidzis izpildi.

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

Piemērs uzdevuma piešķiršanai ExecutorService, izmantojot invokeAny() metodi

Metode invokeAny() ņem Callablle objektu kolekciju vai klašu objektus, kas ievieš Callable. Šī metode atgriež izsaucamā objekta nākotnes objektu, kas vispirms tiek veiksmīgi izpildīts.

 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>

Izvade:

 result = Task 1 

Rezultātā tiek saglabāts 1. uzdevums, jo pirmais izsaucamais objekts tiek veiksmīgi izpildīts vispirms.

Piemērs uzdevuma piešķiršanai ExecutorService, izmantojot invokeAll() metodi

Metode invokeAll() uzņem izsaucamo objektu kolekciju ar uzdevumiem un atgriež nākotnes objektu sarakstu, kurā ir visu uzdevumu rezultāti.

 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>

Izvade:

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

Kā izslēgt ExecutorService

Kad esam pabeiguši ExecutorService dotos uzdevumus, mums tas ir jāizslēdz, jo ExecutorService veic uzdevumu dažādos pavedienos. Ja mēs neizslēgsim ExecutorService, pavedieni turpinās darboties, un JVM netiks izslēgts.

Izslēgšanas procesu var veikt, izmantojot šādas trīs metodes:

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