Mikä on ExecutorService Java-ohjelmassa ja miten se luodaan?



Tämä artikkeli käsittelee Executor-aliliittymän ExecutorService-käsitettä Java-ohjelmassa useilla esimerkeillä selittämään langan luomista ja hallintaa Java-ohjelmassa.

Java-ohjelmointikieli toimii erittäin tehokkaasti sovellukset, jotka edellyttävät tehtävien suorittamista samanaikaisesti ketjussa. Minkä tahansa sovelluksen on vaikea suorittaa useita ketjuja samanaikaisesti. Joten tämän ongelman voittamiseksi, mukana tulee ExecutorService, joka on . Tässä artikkelissa keskustelemme ExecutorServicen toiminnallisuudesta Javassa. Tässä blogissa käsitellään seuraavia aiheita:

Mikä on Executor Framework?

Yksi tai kaksi säiettä on melko helppoa tehdä ja suorittaa samanaikaisesti. Mutta siitä tulee vaikeaa, kun ketjujen määrä kasvaa merkittäväksi määräksi. Suurissa monisäikeisissä sovelluksissa on satoja säikeitä käynnissä samanaikaisesti. Siksi on järkevää erottaa langan luominen langanhallinnasta sovelluksessa.





Toteuttaja on a auttaa sinua luomaan ja hallitsemaan ketjuja sovelluksessa. auttaa sinua seuraavissa tehtävissä.

  • Kierteen luominen: Se tarjoaa erilaisia ​​menetelmiä ketjujen luomiseen, mikä auttaa sovellusten ajamisessa samanaikaisesti.



  • Langanhallinta: Se hallitsee myös langan elinkaarta. Sinun ei tarvitse huolehtia, jos ketju on aktiivinen, varattu tai kuollut, ennen kuin lähetät tehtävän suoritettavaksi.

  • Tehtävän lähettäminen ja suorittaminen: Suorittimen kehys tarjoaa menetelmät tehtävien lähettämistä ketjuturvaan. Se antaa myös valinnan päättää, suoritetaanko ketju vai ei.

toimeenpanopalvelu-toimeenpanopalvelu java -edurekassa

ExecutorService Java-esimerkissä

Se on suoritinkehyksen aliliitäntä, joka lisää tiettyjä toimintoja sovelluksen ketjun elinkaaren hallintaan. Se tarjoaa myös submite () -menetelmän, joka hyväksyy sekä ajettavan että soitettavan esineitä.



Seuraavassa esimerkissä luodaan ExecutorService yhdellä säikeellä ja lähetämme sitten suoritettavan tehtävän langan sisällä.

Tuo java.util.concurrent.ExecutorService Tuo java.util.concurrent.Executors public class Esimerkki {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('ExecutorServicen luominen') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('juoksevan luominen') Runnable runnable = () -> {System.out.println (sisällä: '+ Thread.currentThread (). GetName ())} System.out.println (' lähetä suoritettavan palvelun määrittämä tehtävä suorittajapalvelulle ') executorservice.submit (suoritettava)}}
 Tuotos: Sisäpuoli: pääsovelluksen luominen ExecutorService, joka luo ajettavan version, lähetä suoritettavan palvelun määrittelemä tehtävä suorittajapalvelulle sisällä: pool-1-thread-1

Ylempi näyttää kuinka voimme luoda ExecutorService-palvelun ja suorittaa tehtävän suorittimen sisällä. Jos tehtävä lähetetään suoritettavaksi ja ketju on tällä hetkellä varattu suorittamaan toista tehtävää, tehtävä odottaa jonossa, kunnes ketju voi vapaasti suorittaa sen.

Kun suoritat yllä olevan ohjelman, ohjelma ei koskaan poistu. Sinun on suljettava se nimenomaisesti, koska toteutuspalvelu kuuntelee jatkuvasti uusia tehtäviä.

Java ExecutorService -toteutukset

ExecutorService on hyvin samankaltainen kuin säiejoukko. Itse asiassa ExecutorServicen toteutus java.util.concurrentissa paketti on threadpool-toteutus. ExecutorServicella on seuraavat toteutukset java.util.concurrent-paketissa:

ThreadPoolExecutor

ThreadPoolExecutor suorittaa annetut tehtävät yhdellä sisäisesti yhdistetyistä säikeistä.

ThreadPoolExecutorin luominen

int corePoolSize = 5 int maxPoolSize = 10 pitkä keepAliveTime = 5000 ExecutorService threadPoolExecutor = uusi threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, uusi LinkedBlockingQueue ())

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor on ExecutorService, joka voi ajoittaa tehtävien suorittamisen viiveen jälkeen tai suoritettavaksi toistuvasti tietyllä aikavälillä kunkin suorituksen välillä.

Esimerkki

ScheduledExecutorService scheduleexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture schedulefuture = tervezettExecutorService.schedule (uusi Callable () {public Object call () heittää poikkeuksen {System.out.println ('suoritettu') paluu 'aika' nimeltään '}}. SECONDS)

ExecutorService-käyttö

On olemassa muutama tapa siirtää tehtäviä ExecutorServicelle.

  • suorittaa (ajettava)

  • lähetä (ajettava)

  • invokeAny ()

  • invokeAll ()

Suorita Runnable

Java ExecutorService execute (Runnable) vie java.lang.Runnable-objektin ja suorittaa sen asynkronisesti.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (uusi Runnable () {public void run () {System.out.println ('asynkroninen tehtävä')}}) executorService.shutdown ()

Ei ole mitään keinoa saada suoritettavan Runnable-tulosta, sillä sinun on käytettävä Callable-toimintoa.

Lähetä Runnable

Java ExecutorService submit (Runnable) -menetelmä vie Runnable-toteutuksen ja palauttaa tulevan objektin. Tulevaa objektia voidaan käyttää tarkistamaan, onko Runnable suoritettu loppuun.

Tulevaisuuden tulevaisuus = executorService.submit (uusi Runnable () {public void run () {System.out.println (: asynkroninen tehtävä ')}}) future.get () // palauttaa arvon null, jos tehtävä on valmis oikein.

Lähetä soitettava

Java ExecutorService Lähetä (Callable) -menetelmä on samanlainen kuin Submit (Runnable), mutta se vaatii Java Callable Runnable -vaihtoehdon sijaan.

Tulevaisuuden tulevaisuus = executorService.submit (uusi soitettava () {julkisen objektin kutsu () heittää poikkeuksen {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'tulevaisuus.get ())
 Tuotos: Asynchroous callable future.get = Soitettava tulos

invokeAny ()

InvokeAny () -menetelmä vie kokoelman Callable-objekteja. Tämän menetelmän kutsuminen ei palauta tulevaisuutta, mutta palauttaa yhden soitettavan objektin tuloksen.

ExecutorService executorService = Executors.newSingleThreadExecutor () -joukkocallables = uusi HashSet() callables.add (uusi Callable () {public String call () heittää poikkeuksen {return'task A '}}) callables.add (new Callable () {public String call () heittää Exception {return'task B'} }) callables.add (new Callable () {public String call () heittää poikkeuksen {return'task C '}}) Merkkijonon tulos = executorService.invokeAny (callables) System.out.println (' result = '+ tulos) executorService .sammuttaa()

Kun suoritat yllä olevan koodin, tulos muuttuu. Se voi olla tehtävä A, tehtävä B ja niin edelleen.

InvokeAll ()

InvokeAll () -menetelmä kutsuu kaikki parametreina välitetyt Callable-objektit. Se palauttaa tulevat objektit, joita voidaan käyttää kutsujen suoritustulosten saamiseen.

ExecutorService executorService = Executors.newSingleThreadExecutor () -joukkocallables = uusi HashSet() callables.add (uusi Callable () {public String call () heittää poikkeuksen {return 'Task A'}}) callables.add (new Callable () {public String call () heittää Exception {return 'Task B'} }) callables.add (new Callable () {public String call () heittää poikkeuksen {return 'Task C'}})futures = executorService.invokeAll (soitettavat) kohteelle (Future future: futures) {System.out.println ('future.get =' + future.get ())} végrehajtajaService.shutdown ()

Runnable vs Callable

Suoritettavat ja soitettavat liitännät ovat hyvin samanlaisia ​​toistensa kanssa. Ero on nähtävissä rajapinnat. Molemmat käyttöliittymät edustavat tehtävää, jonka ketju tai ExecutorService voi suorittaa samanaikaisesti.

Soitettava vakuutus:

julkinen käyttöliittymä Soitettava {public object call () heittää poikkeuksen}

Ajettava ilmoitus:

julkinen käyttöliittymä Käynnissä {public void run ()}

Suurin ero näiden kahden välillä on se, että call () -menetelmä voi palauttaa objektin menetelmäpuhelusta. Ja call () -menetelmä voi heittää run () -menetelmä ei voi.

mitä .innerhtml tekee

peruuta tehtävä

Voit peruuttaa ExecutorServicelle lähetetyn tehtävän yksinkertaisesti soittamalla peruutustapaa tulevaisuudessa, joka lähetetään, kun tehtävä lähetetään.

future.cancel ()

ExecutorService Shutdown

Sulje ExecutorService, jotta ketjut eivät käynnisty edes suorituksen jälkeen.

sammuttaa()

Voit lopettaa ketjut ExecutorServicen sisällä kutsumalla shutdown () -menetelmää.

executorService.shutdown ()

Tämä vie meidät tämän artikkelin loppuun, jossa olemme oppineet, kuinka voimme käyttää ExecutorServicea tehtävien suorittamiseen ketjussa. Toivon, että olet selvillä kaikesta, mitä sinulle on jaettu tässä opetusohjelmassa.

Jos pidit tämän artikkelin ”ExecutorService in Java” -osiossa, tutustu artikkeliin luotettava verkko-oppimisyritys, jolla on yli 250 000 tyytyväisen oppijan verkosto, levinneenä ympäri maailmaa.

Autamme sinua matkan jokaisessa vaiheessa ja keksimme opetussuunnitelman, joka on tarkoitettu opiskelijoille ja ammattilaisille, jotka haluavat olla Java-kehittäjiä. Kurssi on suunniteltu antamaan sinulle etumatka Java-ohjelmointiin ja kouluttamaan sekä ydin- että edistyneitä Java-käsitteitä sekä erilaisia Kuten Lepotila & .

Jos kohtaat kysymyksiä, kysy rohkeasti 'ExecutorService in Java' -kommenttiosasta, ja tiimimme vastaa mielellään.