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?
- ExecutorService Java-esimerkissä
- Java ExecutorService -toteutukset
- ExecutorService-käyttö
- Runnable vs Callable
- ExecutorService Shutdown
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.
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.