Kas yra „ExecutorService“ sistemoje „Java“ ir kaip ją sukurti?



Šiame straipsnyje pateikiama „Executor“ sąsajos „ExecutorService“ „Java“ sąvoka su įvairiais pavyzdžiais, paaiškinančiais „Java“ gijų kūrimą ir valdymą.

„Java“ programavimo kalba veikia labai efektyviai programos, kurioms reikalingos užduotys turi būti vykdomos vienu metu gijoje. Bet kuriai programai tampa sunku vienu metu vykdyti daugybę gijų. Taigi, norėdami įveikti šią problemą, ateina su ExecutorService, kuri yra . Šiame straipsnyje aptarsime „Java“ „ExecutorService“ funkcionalumą. Toliau pateikiamos šio tinklaraščio temos:

Kas yra „Executor Framework“?

Gana lengviau padaryti ir atlikti vieną ar dvi gijas vienu metu. Bet tampa sunku, kai gijų skaičius padidėja iki reikšmingo skaičiaus. Didelėse daugialypėse programose vienu metu veiks šimtai gijų. Todėl visiškai prasminga atskirti gijų kūrimą nuo gijų valdymo programoje.





Vykdytojas yra a padeda jums kurti ir valdyti gijas programoje. The padeda atlikti šias užduotis.

  • Gijų kūrimas: jame pateikiami įvairūs gijų kūrimo metodai, kurie padeda vienu metu paleisti jūsų programas.



  • Gijos valdymas: jis taip pat valdo gijos gyvavimo ciklą. Prieš pateikdami užduotį vykdyti, nesijaudinkite, ar gija yra aktyvi, užimta ar negyva.

  • Užduočių pateikimas ir vykdymas: vykdytojo sistemoje pateikiami užduočių pateikimo gijų grupėje metodai. Ji taip pat suteikia teisę nuspręsti, ar gija bus vykdoma, ar ne.

vykdytojo tarnyba-vykdytojo tarnyba java -edurekoje

„ExecutorService“ „Java“ pavyzdyje

Tai yra vykdytojo sistemos sąsaja, pridedanti tam tikras funkcijas, kad būtų galima valdyti programos gijos gyvavimo ciklą. Tai taip pat pateikia „submit“ () metodą, kuris gali priimti ir paleidžiamą, ir iškviečiamą objektai.



Šiame pavyzdyje sukursime „ExecutorService“ su viena gija ir tada pateiksime užduotį, kuri bus vykdoma gijos viduje.

importuoti java.util.concurrent.ExecutorService importuoti java.util.concurrent.Executors public class Pavyzdys {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('sukuriant ExecutorService') ExecutorService vykdytojaservice = Executors.newSingleThreadExecutor () System.out.println ('sukuriant bėgamą') vykdomas veikia = () -> {System.out.println ('viduje: '+ Thread.currentThread (). GetName ())} System.out.println (' pateikite vykdomosios nurodytą užduotį vykdytojo tarnybai ') executorservice.submit (vykdoma)}}
 Išvestis: Viduje: pagrindinis „ExecutorService“ sukūrimas paleidžiamosios programos sukūrimui pateikite vykdomosios tarnybos užduotį, kurią nurodė vykdoma tarnyba:

Aukščiau parodo, kaip mes galime sukurti „ExecutorService“ ir vykdyti užduotį vykdytojo viduje. Jei užduotis pateikiama vykdyti ir gija šiuo metu yra užimta vykdant kitą užduotį, užduotis laukia eilėje, kol gija galės ją vykdyti.

Paleidus pirmiau nurodytą programą, programa niekada neišeis. Turėsite aiškiai jį išjungti, nes vykdytojo tarnyba nuolat klauso naujų užduočių.

„Java ExecutorService“ diegimai

„ExecutorService“ yra labai panašus į siūlų grupę. Tiesą sakant, „ExecutorService“ diegimas java.util.concurrent paketą yra „threadpool“ įgyvendinimas. „ExecutorService“ pakete java.util.concurrent yra šie diegimai:

„ThreadPoolExecutor“

„ThreadPoolExecutor“ vykdo nurodytas užduotis naudodama vieną iš savo viduje sujungtų gijų.

„ThreadPoolExecutor“ sukūrimas

int corePoolSize = 5 int maxPoolSize = 10 ilgų keepAliveTime = 5000 ExecutorService threadPoolExecutor = nauja threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, nauja „LinkedBlockingQueue“)

„ScheduledThreadPoolExecutor“

„Java.util.concurrent.ScheduledThreadPoolExecutor“ yra „ExecutorService“, kuri gali suplanuoti užduotis vykdyti po uždelsimo arba vykdyti pakartotinai su nustatytu laiko intervalu tarp kiekvieno vykdymo.

Pavyzdys

ScheduledExecutorService scheduleexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture schedulefuture = tervezettExecutorService.schedule (new Callable () {public Object call () throws Exception {System.out.println ('įvykdytas' 5 return, Time 'called'}}). SECONDS)

„ExecutorService“ naudojimas

Yra keli skirtingi būdai, kaip perduoti užduotis „ExecutorService“.

  • vykdyti (paleidžiamas)

  • pateikti (vykdoma)

  • invokeAny ()

  • invokeAll ()

Vykdyti „Runnable“

„Java ExecutorService“ vykdoma (vykdoma) paima „java.lang.Rang“ objektą ir vykdo jį asinchroniškai.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (nauja Paleidžiama () {public void run () {System.out.println ('asinchroninė užduotis')}}) executorService.shutdown ()

Nėra jokio būdo gauti vykdomojo „Runnable“ rezultatą, tam turite naudoti „Callable“.

Pateikti vykdomas

„Java ExecutorService“ pateikimo (vykdomas) metodas paleidžia „Runnable“ diegimą ir grąžina būsimą objektą. Būsimą objektą galima naudoti norint patikrinti, ar „Runnable“ baigė vykdyti.

Ateities ateitis = executorService.submit (nauja Paleidžiama () {public void run () {System.out.println (: asinchroninė užduotis ')}}) future.get () // grąžina nulį, jei užduotis baigta teisingai.

Pateikti skambinamą

„Java ExecutorService“ pateikimo (iškviečiamas) metodas yra panašus į pateikimo (paleidžiamo) metodą, tačiau tam reikia „Java Callable“, o ne „Runnable“.

Ateities ateitis = executorService.submit (new Callable () {public Object call () išmeta išimtį {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'ateitis.get ())
 Išvestis: Asynchroous callable future.get = Skambinamas rezultatas

invokeAny ()

Metodas invokeAny () ima skambinamų objektų rinkinį. Pakvietus šį metodą negrąžinama jokia ateitis, tačiau pateikiamas vieno iš „Callable“ objektų rezultatas.

ExecutorService executorService = Executors.newSingleThreadExecutor () rinkinysskambinamieji = naujas „HashSet“() callables.add (new Callable () {public String call () throws Exception {return'task A '}}) callables.add (new Callable () {public String call () throws Exception {return'task B'} }) callables.add (new Callable () {public String call () meta išimtį {return'task C '}}) Stygos rezultatas = executorService.invokeAny (callables) System.out.println (' result = '+ result) executorService .išjungti()

Paleidus pirmiau nurodytą kodą, rezultatas pasikeičia. Tai gali būti A užduotis, B užduotis ir pan.

„InvokeAll“ ()

Metodas „invokeAll ()“ iškviečia visus iškviečiamus objektus, perduotus kaip parametrus. Jis pateikia būsimus objektus, kuriuos galima naudoti norint gauti kiekvieno „Callable“ vykdymo rezultatus.

ExecutorService executorService = Executors.newSingleThreadExecutor () rinkinysskambinamieji = naujas „HashSet“() callables.add (new Callable () {public String call () throws Exception {return 'Task A'}}}) callables.add (new Callable () {public String call () throws Exception {return 'Task B'} }) callables.add (new Callable () {public String call () meta išimtį {return 'Task C'}})futures = executorService.invokeAll (callable), skirtas (Future future: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Bėgama vs skambinama

Paleistinos ir skambinamos sąsajos yra labai panašios viena į kitą. Skirtumas matomas deklaracijoje sąsajos. Abi sąsajos reiškia užduotį, kurią vienu metu gali vykdyti gija arba „ExecutorService“.

Deklaruojama deklaracija:

viešoji sąsaja Skambinama {public object call () throws Exception}

Vykdoma deklaracija:

viešoji sąsaja Vykdoma {public void run ()}

Pagrindinis skirtumas tarp jų yra tas, kad metodas call () gali grąžinti objektą iš metodo skambučio. Skambinimo () metodas gali mesti o run () metodas negali.

paprastas įvadas į duomenų mokslą

atšaukti užduotį

Galite atšaukti „ExecutorService“ pateiktą užduotį paprasčiausiai paskambinę atšaukimo metodui, pateiktam ateityje, kai bus pateikta užduotis.

ateitis. atšaukti ()

„ExecutorService“ išjungimas

Norėdami, kad gijos nevykdytų net ir baigus vykdyti, turėtumėte išjungti „ExecutorService“.

išjungti()

Norėdami nutraukti gijas „ExecutorService“ viduje, galite iškviesti „shutdown“) metodą.

executorService.shutdown ()

Taip pateksime į šio straipsnio pabaigą, kur mes sužinojome, kaip galime naudoti „ExecutorService“, kad vykdytume užduotis. Tikiuosi, kad jums aišku viskas, kas su jumis buvo pasidalinta šioje pamokoje.

Jei jums pasirodė, kad šis straipsnis yra „ExecutorService in Java“, patikrinkite patikima internetinė mokymosi įmonė, turinti daugiau nei 250 000 patenkintų besimokančiųjų tinklą, pasklido po visą pasaulį.

Mes norime jums padėti kiekviename žingsnyje ir parengti mokymo programą, skirtą studentams ir specialistams, norintiems būti „Java“ kūrėjais. Kursas sukurtas tam, kad galėtumėte pradėti žvalgytis į „Java“ programavimą ir išmokyti pagrindines ir pažangias „Java“ koncepcijas kartu su įvairiomis Kaip Hibernate & .

Jei kyla klausimų, nedvejodami užduokite visus klausimus komentarų skyriuje „ExecutorService in Java“, ir mūsų komanda mielai atsakys.