Mis on Java-s ExecutorService ja kuidas seda luua?



Selles artiklis käsitletakse Java-s Executori alamliidese ExecutorService mõistet koos erinevate näidetega Java-s toimuvate lõime loomise ja haldamise selgitamiseks.

Java programmeerimiskeel töötab väga tõhusalt rakendused, mis nõuavad toimingute samaaegset täitmist lõimes. Iga rakenduse jaoks on raske samaaegselt käivitada suurt hulka lõime. Selle probleemi ületamiseks kaasas ExecutorService, mis on . Selles artiklis käsitleme Java ExecutorService'i funktsionaalsust. Selles blogis käsitletakse järgmisi teemasid:

Mis on Executor Framework?

Ühe või kahe lõime samaaegne koostamine ja käivitamine on üsna hõlpsam. Kuid see muutub keeruliseks, kui niitide arv kasvab märkimisväärseks. Suurtes mitmekeermelistes rakendustes töötab korraga sadu niite. Seetõttu on täiesti mõistlik eraldada rakenduses lõime loomine lõime haldamisest.





Täitja on a aitab teil rakenduses lõime luua ja hallata. The aitab teil teha järgmisi ülesandeid.

  • Lõnga loomine: see pakub lõimede loomiseks mitmesuguseid meetodeid, mis aitavad teie rakendusi samaaegselt käivitada.



  • Keermehaldus: see haldab ka lõime elutsüklit. Enne ülesande täitmiseks esitamist ei pea te muretsema, kas lõim on aktiivne, hõivatud või surnud.

  • Ülesande esitamine ja täitmine: teostajaraamistik pakub meetodeid ülesande esitamiseks lõimepargis. See annab ka õiguse otsustada, kas lõim käivitatakse või mitte.

täituriteenus-täituriteenus javas -edurekas

ExecutorService Java näites

See on täiturraamistiku alaliides, mis lisab rakenduse lõime elutsükli haldamiseks teatud funktsionaalsused. See pakub ka submiteerimise () meetodit, mis aktsepteerib nii käivitatavaid kui ka helistatavaid objektid.



Järgmises näites loome ühe lõimega ExecutorService ja esitame seejärel lõime sees täidetava ülesande.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors public class Näide {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('ExecutorService'i loomine') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('jooksva loomine') Runnable runnable = () -> {System.out.println ('sees: '+ Thread.currentThread (). GetName ())} System.out.println (' esitage käivitatava poolt määratud ülesanne täidesaatjale ') executorservice.submit (käivitatav)}}
 Väljund: Sees: põhiloomine ExecutorService käivitatava loomine esitage käivitatava määratud ülesanne täidetavale teenusele sees: pool-1-thread-1

Ülaltoodud näitab, kuidas saame ExecutorService'i luua ja täituri sees täita. Kui ülesanne esitatakse täitmiseks ja lõim on praegu teise ülesande täitmisega hõivatud, ootab ülesanne järjekorras, kuni lõim on selle täitmiseks vaba.

Kui käivitate ülaltoodud programmi, ei lahku programm kunagi. Peate selle selgesõnaliselt sulgema, kuna testamenditeenus jätkab uute ülesannete kuulamist.

Java ExecutorService'i rakendused

ExecutorService sarnaneb paljuski niidipaketiga. Tegelikult on ExecutorService'i rakendamine java.util.concurrent pakend on niidipõhine teostus. ExecutorService'il on paketis java.util.concurrent järgmised rakendused:

ThreadPoolExecutor

ThreadPoolExecutor täidab etteantud ülesandeid ühe oma sisemiselt ühendatud niidi abil.

ThreadPoolExecutori loomine

int corePoolSize = 5 int maxPoolSize = 10 pikka keepAliveTime = 5000 ExecutorService threadPoolExecutor = uus threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, uus LinkedBlockingQueue ())

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor on ExecutorService, mis saab ajastada ülesannete täitmist viivituse järel või korduva täitmise kindla ajavahemiku järel iga täitmise vahel.

Näide

ScheduledExecutorService regularexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture schedulefuture = tervezettExecutorService.schedule (uus helistatav () {public Object call () viskab erandi {System.out.println ('täidetud') tagastamine 'kutsutakse'}} SEKUNDID)

ExecutorService'i kasutamine

Ülesannete delegeerimiseks ExecutorService'ile on mõned erinevad viisid.

  • täitma (käivitatav)

  • esitama (käivitatav)

  • invokeAny ()

  • invokeAll ()

Käivita Runnable

Java ExecutorService execute (käivitatav) võtab java.lang.Runnable objekti ja käivitab selle asünkroonselt.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (uus Runnable () {public void run () {System.out.println ('asünkroonne ülesanne')}}) executorService.shutdown ()

Execute Runnable tulemuse saamiseks pole mingit võimalust, selleks peate kasutama Callable'i.

Esitage Runnable

Java ExecutorService'i esitamise (käitatav) meetod võtab käivitatava rakenduse ja tagastab tulevase objekti. Tulevase objekti abil saab kontrollida, kas Runnable on täitmise lõpetanud.

Tuleviku tulevik = executorService.submit (uus Runnable () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // tagastab null, kui ülesanne on õigesti lõpule viidud.

Esita helistatav

Java ExecutorService'i saatmismeetod (helistatav) on sarnane esitamise (käivitatav) meetodile, kuid see nõuab käitatava asemel Java helistatavat.

Tuleviku tulevik = executorService.submit (uus helistatav () {public Object call () viskab erandi {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'tulevik.get ())
 Väljund: Asynchroous callable future.get = Helistatav tulemus

invokeAny ()

Meetod invokeAny () võtab helistatavate objektide kogu. Selle meetodi käivitamine ei tagasta tulevikku, kuid tagastab ühe helistatava objekti tulemuse.

ExecutorService executorService = Executors.newSingleThreadExecutor () komplektcallable = uus HashSet() callables.add (uus Callable () {public String call () heidab erandi {return'task A '}}) callables.add (new Callable () {public String call () viskab Exception {return'task B'} }) callables.add (new Callable () {public String call () heidab erandi {return'task C '}}) Stringi tulemus = executorService.invokeAny (callables) System.out.println (' result = '+ tulemus) executorService .Lülita välja()

Kui käivitate ülaltoodud koodi, muutub tulemus. See võib olla ülesanne A, ülesanne B ja nii edasi.

InvokeAll ()

Meetod invokeAll () kutsub esile kõik parameetritena edastatud Callable objektid. See tagastab tulevased objektid, mida saab kasutada iga Callable'i käivitamise tulemuste saamiseks.

ExecutorService executorService = Executors.newSingleThreadExecutor () komplektcallable = uus HashSet() callables.add (uus Callable () {public String call () heidab erandi {return 'Task A'}}} callables.add (new Callable () {public String call () viskab Exception {return 'Task B'} }) callables.add (new Callable () {public String call () heidab erandi {return 'Task C'}}) loendfutures = executorService.invokeAll (callable) domeenile (Future future: futures) {System.out.println ('future.get =' + future.get ())} végrehajtajaService.shutdown ()

Jooksev vs helistatav

Jooksvad ja helistatavad liidesed on üksteisega väga sarnased. Erinevus on nähtav liidesed. Mõlemad liidesed esindavad ülesannet, mida saab lõime või ExecutorService abil samaaegselt täita.

Helistatav deklaratsioon:

avalik liides Helistatav {public object call () throws Exception}

Töötav deklaratsioon:

avalik liides käitatav {public void run ()}

Peamine erinevus nende kahe vahel on see, et meetod call () võib meetodi kutsest objekti tagasi tuua. Ja call () meetod võib visata samas run () meetod ei saa.

android stuudio samm-sammult

ülesande tühistamine

ExecutorService'ile edastatud ülesande saate tühistada, helistades lihtsalt ülesande esitamisel tulevikus saadetud tühistamismeetodile.

future.cancel ()

ExecutorService Shutdown

Niitide käivitamise vältimiseks ka pärast täitmise lõppu peaksite ExecutorService välja lülitama.

Lülita välja()

Lõimede lõpetamiseks ExecutorService'is saate helistada shutdown () meetodile.

végrehajtajaService.shutdown ()

See viib meid selle artikli lõppu, kus oleme õppinud, kuidas saame ExecutorService'i abil lõimes ülesandeid täita. Loodan, et teil on selge kõigega, mida teiega selles õpetuses jagati.

Kui leiate, et see artikkel on jaotises „Java ExecutorService” asjakohane, vaadake järgmist usaldusväärne veebiõppeettevõte, mille võrgustik sisaldab üle 250 000 rahuloleva õppija, levis üle kogu maailma.

Oleme siin, et aidata teid igal sammul oma teekonnal ja koostada õppekava, mis on mõeldud õpilastele ja spetsialistidele, kes soovivad olla Java arendajad. Kursus on loodud selleks, et anda Java-programmeerimisele edukas algus ja õpetada teid nii põhi- kui ka edasijõudnute Java-kontseptsioonide jaoks koos erinevate võimalustega meeldib Talveunerežiim & .

Kui teil on küsimusi, küsige julgelt kõiki oma küsimusi jaotises „Java ExecutorService” kommentaaride osas ja meie meeskond vastab sellele hea meelega.