Kaj je ExecutorService v Javi in ​​kako jo ustvariti?



Ta članek zajema koncept podvmesnika Executor ExecutorService v Javi z različnimi primeri, ki pojasnjujejo ustvarjanje in upravljanje niti v Javi.

Programski jezik Java deluje zelo učinkovito z aplikacije, ki zahtevajo, da se naloge izvajajo hkrati v niti. Katera koli aplikacija lahko hkrati izvaja veliko število niti. Torej, da bi rešili ta problem, prihaja z ExecutorService, ki je podvmesnik . V tem članku bomo obravnavali funkcionalnost ExecutorService v Javi. V tem blogu so zajete teme:

Kaj je Executor Framework?

Precej lažje je izdelati in izvajati eno ali dve niti hkrati. Toda postane težko, ko se število niti poveča na znatno število. Velike večnitne aplikacije bodo istočasno izvajale na stotine niti. Zato je popolnoma smiselno ločiti ustvarjanje niti od upravljanja niti v aplikaciji.





Izvršitelj je a vam pomaga pri ustvarjanju in upravljanju niti v aplikaciji. The vam pomaga pri naslednjih nalogah.

  • Ustvarjanje niti: ponuja različne metode za ustvarjanje niti, ki pomagajo pri sočasnem zagonu vaših aplikacij.



  • Upravljanje niti: Upravlja tudi življenjski cikel niti. Pred oddajo naloge v izvršitev vam ni treba skrbeti, če je nit aktivna, zasedena ali mrtva.

  • Predložitev in izvršitev naloge: Okvir izvršilca ​​ponuja metode za oddajo nalog v področju niti, prav tako pa daje moč odločanja, ali bo nit izvedena ali ne.

executorservice-executorservice v javi -edureka

ExecutorService v primeru Java

Je podvmesnik izvršilnega ogrodja, ki doda določene funkcije za upravljanje življenjskega cikla niti aplikacije. Zagotavlja tudi metodo submit (), ki lahko sprejme tako izvedljivi kot klicni predmetov.



V naslednjem primeru bomo ustvarili ExecutorService z eno nitjo in nato poslali nalogo, ki jo je treba izvršiti znotraj niti.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors javni razred Primer {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('ustvarjanje ExecutorService') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('ustvarjanje runnable') Runnable runnable = () -> {System.out.println ('znotraj: '+ Thread.currentThread (). GetName ())} System.out.println (' pošlji nalogo, določeno z runnable, na izvršilno službo ') executorservice.submit (runnable)}}
 Izhod: Notranjost: glavno ustvarjanje ExecutorService, ki ustvarja izvedljivo, oddajte nalogo, določeno z izvedljivo, izvršilni službi znotraj: pool-1-thread-1

Zgoraj prikazuje, kako lahko ustvarimo ExecutorService in izvršimo nalogo znotraj izvršitelja. Če je naloga poslana v izvršitev in je nit trenutno zasedena z izvajanjem druge naloge, bo naloga čakala v čakalni vrsti, dokler je nit ne bo mogla zagnati.

Ko zaženete zgornji program, program ne bo nikoli zapustil. Izrecno ga boste morali zapreti, saj izvršilna služba še naprej posluša nova opravila.

Implementacije Java ExecutorService

ExecutorService je zelo podoben področju niti. Pravzaprav izvedba ExecutorService v java.util.concurrent paket je izvedba nabora niti. ExecutorService ima v paketu java.util.concurrent naslednje izvedbe:

ThreadPoolExecutor

ThreadPoolExeecuter dane naloge izvrši z eno od svojih notranje združenih niti.

Ustvarjanje nitiPoolExecutor

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

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor je ExecutorService, ki lahko načrtuje izvajanje nalog po zakasnitvi ali večkratno izvajanje z določenim intervalom med vsako izvedbo.

Primer

ScheduledExecutorService scheduledexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture rasporejeno = načrtovanoExecutorService.schedule (novo Callable () {javni klic predmeta () vrže izjemo {System.out.println ('izvršeno'), vrnjeno 'čas' izvedeno ') SEKUNDE)

Uporaba storitve ExecutorService

Obstaja nekaj različnih načinov za prenos nalog v ExecutorService.

  • izvrši (izvedljivo)

  • oddati (izvedljivo)

  • invokeAny ()

  • invokeAll ()

Izvedite Runnable

Izvršitev Java ExecutorService (Runnable) sprejme objekt java.lang.Runnable in ga izvede asinhrono.

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

Rezultata izvedbe Runnable ni mogoče dobiti, zato morate uporabiti Callable.

Pošlji Runnable

Metoda oddaje Java (ExecutorService) (Runnable) izvede izvedbo Runnable in vrne prihodnji objekt. Prihodnji objekt lahko uporabimo za preverjanje, ali je Runnable končal izvajanje.

Prihodnost = executorService.submit (new Runnable () {public void run () {System.out.println (: asinhrono opravilo ')}}) futur.get () // vrne nič, če je naloga pravilno končana.

Pošlji Callable

Način Java ExecutorService submit (Callable) je podoben načinu submit (Runnable), vendar namesto Runnable potrebuje Java Callable.

Prihodnost = executorService.submit (new Callable () {public Object call () vrže izjemo {System.out.println ('Asinhroni klicni') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'prihodnost.get ())
 Izhod: Asinhroni klicljivi prihodnost.get = Rezultat, ki ga je mogoče poklicati

invokeAny ()

Metoda invokeAny () vzame zbirko predmetov Callable. Priklic te metode ne vrne nobene prihodnosti, ampak vrne rezultat enega od predmetov Callable.

ExecutorService executorService = Izvajalci.newSingleThreadExecutor () Setcallables = nov HashSet() callables.add (new Callable () {public String call () vrže izjemo {return'task A '}}) callables.add (new Callable () {public String call () vrže izjemo {return'task B'} }) callables.add (new Callable () {javni niz klica () vrže izjemo {return'task C '}}) String rezultat = executorService.invokeAny (callables) System.out.println (' result = '+ result) executorService .ugasniti()

Ko zaženete zgornjo kodo, se rezultat spremeni. To je lahko naloga A, naloga B itd.

InvokeAll ()

Metoda invokeAll () prikliče vse predmete Callable, posredovane kot parametre. Vrne bodoče predmete, s katerimi lahko dobite rezultate izvajanja vsakega klicanega.

ExecutorService executorService = Izvajalci.newSingleThreadExecutor () Setcallables = nov HashSet() callables.add (new Callable () {public String call () vrže izjemo {return 'Task A'}}) callables.add (new Callable () {public String call () vrže izjemo {return 'Task B'} }) callables.add (new Callable () {javni klic niza () vrže izjemo {vrni 'Opravilo C'}}) Seznamfutures = executorService.invokeAll (callables) for (Future future: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Runnable vs Callable

Vodljivi in ​​klicljivi vmesniki so si med seboj zelo podobni. Razlika je vidna v izjavi vmesniki. Oba vmesnika predstavljata nalogo, ki jo lahko hkrati izvede nit ali ExecutorService.

Izjava, ki jo je mogoče poklicati:

javni vmesnik Callable {javni objektni klic () vrže izjemo}

Izjava o izvedbi:

javni vmesnik Runnable {public void run ()}

Glavna razlika med obema je, da metoda call () lahko vrne predmet iz klica metode. In metoda call () lahko vrže medtem ko metoda run () ne more.

povezana koda seznama v c

prekliči nalogo

Nalogo, ki ste jo poslali v ExecutorService, lahko prekličete tako, da pri oddaji opravila preprosto pokličete metodo preklica.

future.cancel ()

Izklop storitve

Da se niti ne bi izvajale niti po zaključku izvajanja, zaprite ExecutorService.

ugasniti()

Če želite končati niti znotraj ExecutorService, lahko pokličete metodo shutdown ().

executorService.shutdown ()

To nas pripelje do konca tega članka, kjer smo se naučili, kako lahko z ExecutorService izvajamo naloge v niti. Upam, da vam je jasno vse, kar je bilo v tej vadnici z vami deljeno.

Če se vam zdi ta članek o storitvi »ExecutorService v Javi« ustrezen, si oglejte zaupanja vredno podjetje za spletno učenje z mrežo več kot 250.000 zadovoljnih učencev, razširjenih po vsem svetu.

Tu smo, da vam pomagamo pri vsakem koraku na poti in pripravimo učni načrt, ki je zasnovan za študente in strokovnjake, ki želijo biti razvijalec Java. Tečaj je zasnovan tako, da vam omogoči uvod v programiranje Java in vas usposobi za osnovne in napredne koncepte Java ter različne všeč Hibernate & .

Če naletite na kakršna koli vprašanja, vas prosimo, da vsa vprašanja postavite v oddelku za komentarje v »ExecutorService in Java« in naša ekipa vam bo z veseljem odgovorila.