Java ExecutorService on käyttöliittymä, jonka avulla voimme suorittaa tehtäviä säikeissä asynkronisesti. Java ExecutorService -käyttöliittymä on java.util.concurrent-paketissa. ExecutorService auttaa ylläpitämään lankavarastoa ja määrittää niille tehtäviä. Se tarjoaa myös mahdollisuuden asettaa tehtäviä jonoon, kunnes vapaata säiettä on saatavilla, jos tehtäviä on enemmän kuin käytettävissä olevia säikeitä.
Java ExecutorServicen menetelmät
Menetelmä | Kuvaus |
---|---|
boolean awaitTermination (pitkä aikakatkaisu, aikayksikkö) | Tämä menetelmä estää tehtävän pääsyn ExecutorService-palveluun, kunnes kaikki tehtävät on suoritettu sammutuspyynnön jälkeen tai annettu aikakatkaisu tapahtuu tai nykyinen säie keskeytyy sen mukaan, kumpi tapahtuu ensin. |
Lista | Tämä menetelmä suorittaa annettujen tehtävien luettelon ja palauttaa listan Futureista, jotka sisältävät kaikkien tehtävien tulokset suoritettuaan. |
Lista | Tämä menetelmä suorittaa annettujen tehtävien luettelon ja palauttaa luettelon Futureista, jotka sisältävät kaikkien tehtävien tulokset, kun ne on suoritettu tai aikakatkaisu umpeutuu sen mukaan, kumpi tapahtuu ensin. |
T invokeAny(kokoelma extends Callable>tehtävät) | Tämä menetelmä suorittaa annettujen tehtävien luettelon ja palauttaa yhden tehtävän tuloksen, joka suoritetaan ilman poikkeuksia. |
T invokeAny(kokoelma extends Callable>tehtävät, pitkä aikakatkaisu, TimeUnit-yksikkö) | Tämä menetelmä suorittaa annettujen tehtävien luettelon ja palauttaa yhden tehtävän tuloksen, joka suoritetaan ilman poikkeuksia ennen aikakatkaisun umpeutumista. |
boolean isShutdown() | Tämä menetelmä palauttaa, onko annettu suorittaja suljettu vai ei. |
boolean isTerminated() | Tämä menetelmä palauttaa tosi, jos kaikki tehtävät on suoritettu sammutuksen jälkeen. |
mitätön sammutus () | Tämä menetelmä mahdollistaa aiemmin ExecutorServicelle lähetettyjen tehtävien suorittamisen eikä salli muiden tehtävien hyväksymistä. |
Lista shutdownNow() | Tämä menetelmä pysäyttää kaikki aktiivisesti suoritettavat tehtävät, pysäyttää jonossa olevien tehtävien suorittamisen ja palauttaa luettelon tehtävistä, jotka ovat jonossa. |
Tuleva lähetys (kutsuttava tehtävä) | Tämä menetelmä lähettää arvon palauttavan tehtävän suoritettavaksi ja palauttaa tulevaisuuden, joka edustaa tehtävän odottavaa tulosta. |
Tuleva lähetys (suoritettava tehtävä) | Tämä menetelmä lähettää tehtävän suoritettaviksi ja palauttaa tätä tehtävää edustavan tulevaisuuden. Se palauttaa nollan onnistuneen suorittamisen jälkeen. |
Tuleva lähetys (suoritettava tehtävä, T-tulos) | Tämä menetelmä lähettää tehtävän suoritettaviksi ja palauttaa tätä tehtävää edustavan tulevaisuuden. |
Yksinkertainen Java ExecutorServicen ohjelma
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
Lähtö:
Tässä ohjelmassa luomme kymmenen säikeen ExecutorServicen ja määritämme sille anonyymin suoritettavan toteutuksen, joka suorittaa tehtävän tulostaa 'ExecutorService' ja kun sen tehtävä on ohi, suljemme executor-palvelun.
Java ExecutorServicen käyttäminen
Instantiating ExecutorService
Voimme käyttää Java ExecutorServiceä luodaksesi yhden säikeen, säikeiden joukon tai ajoitetun säikeen poolin. Executors-luokka tarjoaa tehdasmenetelmiä ExecutorServicen luomiseksi seuraavasti:
ExecutorService executorService1 = Executors.newSingleThreadExecutor(); //Creates //a ExecutorService object having a single thread. ExecutorService executorService2 = Executors.newFixedThreadPool(10); // Creates a //ExecutorService object having a pool of 10 threads. ExecutorService executorService3 = Executors.newScheduledThreadPool(10); //Creates a scheduled thread pool executor with 10 threads. In scheduled thread //pool, we can schedule tasks of the threads.
Tehtävien osoittaminen ExecutorServicesille
Voit määrittää tehtävän ExecutorServicelle käyttämällä seuraavia menetelmiä-
- suorita (suoritettava tehtävä)
- lähetä (suoritettava tehtävä) / lähetä (kutsuttava tehtävä)
- invokeAny(kokoelma extends Callable>tehtävät)
- invokeAll(kokoelma extends Callable>tehtävät)
Esimerkki tehtävän määrittämisestä ExecutorServicelle käyttämällä execute()-metodia
Java ExecutorServicen execute()-metodi ottaa vastaan suoritettavan objektin ja suorittaa tehtävänsä asynkronisesti. Suorituskutsun jälkeen kutsumme shutdown-menetelmää, joka estää muita tehtäviä joutumasta executorServicen jonoon.
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
Lähtö:
ExecutorService
Esimerkki tehtävän määrittämisestä ExecutorServicelle käyttämällä submit()
Submit()-metodi ottaa vastaan suoritettavan objektin ja palauttaa Future-objektin. Tätä objektia käytetään myöhemmin tarkistamaan Runnable-tiedoston tila, onko se suoritettu loppuun vai ei.
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); } }
Esimerkki tehtävän määrittämisestä ExecutorServicelle käyttämällä invokeAny()-metodia
InvokeAny()-metodi ottaa Callablle-objektien tai Callable-sovelluksen toteuttavien luokkien objektit. Tämä menetelmä palauttaa kutsuttavan objektin tulevan objektin, joka suoritetaan onnistuneesti ensin.
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); String result = executorService.invokeAny(callables); System.out.println('result = ' + result); executorService.shutdown(); } } </callable></callable>
Lähtö:
result = Task 1
Tulos tallentaa tehtävän 1, koska ensimmäinen kutsuttava objekti suoritetaan onnistuneesti ensin.
Esimerkki tehtävän määrittämisestä ExecutorServicelle käyttämällä invokeAll()-metodia
Metodi invokeAll() ottaa kokoelman kutsuttavia objekteja, joissa on tehtäviä, ja palauttaa luettelon tulevista objekteista, joka sisältää kaikkien tehtävien tuloksen.
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); java.util.List<future> futures = executorService.invokeAll(callables); for(Future future : futures){ System.out.println('future.get = ' + future.get()); } executorService.shutdown(); } } </future></callable></callable>
Lähtö:
future.get = Task 1 future.get = Task 3 future.get = Task 2
Kuinka sammuttaa ExecutorService
Kun olemme saaneet valmiiksi ExecutorServicelle annetut tehtävämme, meidän on suljettava se, koska ExecutorService suorittaa tehtävän eri säikeissä. Jos emme sulje ExecutorServiceä, säikeet jatkavat toimintaansa ja JVM ei sammu.
Sammutusprosessi voidaan tehdä seuraavilla kolmella tavalla:
- shutdown() -menetelmä
- shutdownNow() -menetelmä
- awaitTermination() -menetelmä