Što je ExecutorService u Javi i kako je stvoriti?



Ovaj članak pokriva koncept izvršnog podsučelja ExecutorService u Javi s raznim primjerima koji objašnjavaju stvaranje niti i upravljanje nitima u Javi.

Java programski jezik vrlo učinkovito surađuje s aplikacije koje zahtijevaju istodobno izvršavanje zadataka u niti. Bilo kojoj aplikaciji postaje teško istodobno izvršiti velik broj niti. Da biste prevladali ovaj problem, dolazi s ExecutorService koji je podsučelje . U ovom ćemo članku razgovarati o funkcionalnosti ExecutorService u Javi. Slijede teme obrađene na ovom blogu:

Što je Okvir izvršitelja?

Prilično je lakše istodobno napraviti i izvršiti jednu ili dvije niti. Ali postaje teško kada se broj niti poveća na značajan broj. Velike višenitne aplikacije imat će istovremeno stotine niti. Stoga ima potpuno smisla razdvojiti stvaranje niti od upravljanja nitima u aplikaciji.





Izvršitelj je a pomaže vam u stvaranju i upravljanju nitima u aplikaciji. The pomaže vam u sljedećim zadacima.

  • Stvaranje niti: Pruža razne metode za stvaranje niti koje pomažu u istodobnom pokretanju vaših aplikacija.



  • Upravljanje niti: Također upravlja životnim ciklusom niti. Ne morate se brinuti je li nit aktivna, zauzeta ili mrtva prije nego što zadatak predate na izvršenje.

  • Predavanje i izvršavanje zadatka: Okvir izvršitelja pruža metode za predavanje zadataka u spremištu niti, Također daje moć odlučivanja hoće li se nit izvršiti ili ne.

izvršitelj usluga-izvršitelj usluga u javi -edureka

ExecutorService u primjeru Jave

To je podsučelje izvršnog okvira koje dodaje određene funkcionalnosti za upravljanje životnim ciklusom niti aplikacije. Također pruža metodu submit () koja može prihvatiti i pokrenuti i opoziv predmeta.



U slijedećem primjeru stvorit ćemo ExecutorService s jednom niti, a zatim predati zadatak koji će se izvršiti unutar niti.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors javna klasa Primjer {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('stvaranje ExecutorService') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('stvaranje runnable') Runnable runnable = () -> {System.out.println ('unutra: '+ Thread.currentThread (). GetName ())} System.out.println (' predati zadatak naveden izvodivim izvršnom servisu ') executorservice.submit (runnable)}}
 Izlaz: Iznutra: glavno stvaranje ExecutorService izrada pokrenute datoteke, predajte zadatak naveden izvodljivim izvršnom servisu unutar: pool-1-thread-1

Iznad pokazuje kako možemo stvoriti ExecutorService i izvršiti zadatak unutar izvršitelja. Ako je zadatak poslan na izvršenje, a nit je trenutno zauzeta izvršavanjem drugog zadatka, tada će zadatak čekati u redu dok nit ne može slobodno izvršiti.

Kada pokrenete gornji program, program nikada neće izaći. Morat ćete ga eksplicitno isključiti jer izvršiteljska služba i dalje osluškuje nove zadatke.

Implementacije Java ExecutorService

ExecutorService vrlo je sličan spremištu niti. Zapravo, implementacija ExecutorService u java.util.concurrent paket je implementacija skupa niti. ExecutorService ima sljedeće implementacije u paketu java.util.concurrent:

ThreadPoolExeecuter

ThreadPoolExeecuter izvršava zadane zadatke pomoću jedne od svojih interno udruženih niti.

Stvaranje nitiPoolExecutor

int corePoolSize = 5 int maxPoolSize = 10 long keepAliveTime = 5000 ExecutorService threadPoolExecutor = new threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, novi LinkedBlockingQueue ())

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor je ExecutorService koji može planirati izvršavanje zadataka nakon odgode ili izvršavanje u više navrata s određenim vremenskim razmakom između svakog izvršavanja.

Primjer

ScheduledExecutorService rasporeddexecutorservice = Izvršitelji.newScheduledThreadPool (5) ScheduledFuture rasporedfuture = zakazanExecutorService.schedule (novi Callable () {javni poziv objekta () baca izuzetak {System.out.println ('izvršeno')) ',' izvedeno '),' zove '' izvršeno '). SEKUNDE)

ExecutorService Upotreba

Postoji nekoliko različitih načina delegiranja zadataka na ExecutorService.

  • izvršiti (pokrenuti)

  • pošalji (može se pokrenuti)

  • invokeAny ()

  • invokeAll ()

Izvršiti Runnable

Izvršenje Java ExecutorService (Runnable) uzima objekt java.lang.Runnable i izvršava ga asinkrono.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (new Runnable () {public void run () {System.out.println ('asinhroni zadatak')}}) executorService.shutdown ()

Ne postoji način da se dobije rezultat izvršenja Runnable, za to morate koristiti Callable.

Pošaljite Izvodljivo

Metoda podnošenja Java ExecutorService (Runnable) uzima izvedbu Runnable i vraća budući objekt. Budući objekt može se koristiti za provjeru je li Runnable završio izvršenje.

Budućnost = executorService.submit (new Runnable () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // vraća nulu ako je zadatak dovršen ispravno.

Pošalji Callable

Metoda podnošenja Java (ExecutorService) (Callable) slična je pošiljanju (Runnable), ali uzima Java Callable umjesto Runnable.

Budućnost = executorService.submit (new Callable () {public Object call () baca izuzetak {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'future.get ())
 Izlaz: Asinkroni poziv koji se može pozvati.get = Rezultat koji se može pozvati

invokeAny ()

Metoda invokeAny () uzima kolekciju objekata koji se mogu pozvati. Pozivanje ove metode ne vraća nikakvu budućnost, već vraća rezultat jednog od objekata koji se mogu pozvati.

ExecutorService executorService = Izvršitelji.newSingleThreadExecutor () Setcallables = novi HashSet() callables.add (novi Callable () {javni poziv niza () baca izuzetak {return'task A '}}) callables.add (novi Callable () {javni poziv niza () baca izuzetak {return'task B'} }) callables.add (novi Callable () {javni poziv niza () baca izuzetak {return'task C '}}) String rezultat = executorService.invokeAny (callables) System.out.println (' rezultat = '+ rezultat) executorService .ugasiti()

Kada pokrenete gornji kod, rezultat se mijenja. To bi mogli biti Zadatak A, Zadatak B i tako dalje.

InvokeAll ()

Metoda invokeAll () poziva sve Callable objekte proslijeđene kao parametre. Vraća buduće objekte koji se mogu koristiti za dobivanje rezultata izvršavanja svakog poziva.

ExecutorService executorService = Izvršitelji.newSingleThreadExecutor () Setcallables = novi HashSet() callables.add (novi Callable () {javni poziv niza () baca izuzetak {povratak 'Zadatak A'}}) callables.add (novi Callable () {javni poziv niza () baca izuzetak {povratak 'Zadatak B}} }) callables.add (new Callable () {public String call () baca iznimku {return 'Task C'}}) Popisfutures = executorService.invokeAll (callables) for (Buduća budućnost: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Runnable vs Callable

Izvodljivo i pozivno sučelje vrlo su međusobno slični. Razlika je vidljiva u deklaraciji sučelja. Oba sučelja predstavljaju zadatak koji se može istodobno izvršiti pomoću niti ili ExecutorService.

Izjava koja se može pozvati:

javno sučelje Callable {poziv javnog objekta () baca iznimku}

Izjava o izvozu:

javno sučelje Izvodljivo {public void run ()}

Glavna razlika između njih dvije je ta što metoda call () može vratiti objekt iz poziva metode. A metoda call () može baciti dok metoda run () ne može.

rubin na šinama web tutorial

otkazati zadatak

Možete otkazati zadatak poslan na ExecutorService jednostavnim pozivom metode otkazivanja na budućem poslanom zadatku kada je zadatak poslan.

future.cancel ()

Isključivanje izvršne usluge

Da biste spriječili pokretanje niti nakon završetka izvršenja, trebali biste isključiti ExecutorService.

ugasiti()

Da biste prekinuli niti unutar ExecutorService, možete nazvati metodu shutdown ().

executorService.shutdown ()

To nas dovodi do kraja ovog članka, gdje smo naučili kako možemo koristiti ExecutorService za izvršavanje zadataka u niti. Nadam se da vam je jasno sve što je s vama podijeljeno u ovom vodiču.

Ako smatrate da je ovaj članak o 'ExecutorService u Javi' relevantan, pogledajte pouzdana tvrtka za internetsko učenje s mrežom od više od 250 000 zadovoljnih učenika raširenih širom svijeta.

Ovdje smo da vam pomognemo u svakom koraku na putovanju i osmislimo kurikulum namijenjen studentima i profesionalcima koji žele biti programer Java. Tečaj je osmišljen kako bi vam pružio prednost u programiranju Java-a i osposobio vas za osnovne i napredne Java koncepte, zajedno s raznim Kao Hibernate & .

Ako naiđete na neko pitanje, slobodno postavite sva svoja pitanja u odjeljku za komentare 'ExecutorService in Java' i naš će tim rado odgovoriti.