Mi az ExecutorService a Java-ban és hogyan hozható létre?



Ez a cikk az Executor al-interfész ExecutorService Java-koncepcióját tárgyalja, különféle példákkal a szálak létrehozásának és kezelésének elmagyarázására a Java-ban.

A Java programozási nyelv nagyon hatékonyan működik alkalmazások, amelyek megkövetelik a feladatok egyidejű végrehajtását egy szálon. Bármely alkalmazás számára nehézzé válik nagyszámú szál egyidejű végrehajtása. Tehát ennek a problémának a leküzdésére, az ExecutorService szolgáltatással érkezik, amely a . Ebben a cikkben az ExecutorService Java-ban történő működését tárgyaljuk. A következő témákkal foglalkozik ez a blog:

Mi az az Executor Framework?

Meglehetősen könnyebb egy vagy két szálat egyszerre elkészíteni és végrehajtani. De nehézzé válik, amikor a szálak száma jelentős számra növekszik. A nagy, több szálon futó alkalmazásoknál több száz szál fut egyszerre. Ezért teljesen ésszerű elkülöníteni a szálak létrehozását a szálak kezelésétől egy alkalmazásban.





A végrehajtó a segít az alkalmazás szálainak létrehozásában és kezelésében. Az segít a következő feladatok elvégzésében.

  • Szálkészítés: Számos módszert kínál a szálak létrehozásához, amelyek segítenek az alkalmazások egyidejű futtatásában.



  • Szálkezelés: A szál életciklusát is kezeli. A feladat végrehajtásra benyújtása előtt nem kell aggódnia, ha a szál aktív, foglalt vagy halott.

  • Feladat benyújtása és végrehajtása: Az Executor keretrendszer a feladat-elküldés módszereit kínálja a szálkészletben. Megadja a hatalmat annak eldöntésére is, hogy a szál végrehajtásra kerül-e vagy sem.

végrehajtószolgáltatás-végrehajtószolgáltatás java -edurekában

ExecutorService a Java példában

Ez a végrehajtó keretrendszer egyik alfelülete, amely bizonyos funkciókat ad hozzá az alkalmazás szál életciklusának kezeléséhez. Ezenkívül egy submit () metódust is biztosít, amely futható és hívható is elfogadható tárgyakat.



A következő példában létrehozunk egy ExecutorService szolgáltatást egyetlen szálzal, majd benyújtjuk a szálon belül végrehajtandó feladatot.

java.util.concurrent.ExecutorService importálása java.util.concurrent.Executors public class Példa {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('ExecutorService létrehozása') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('futható létrehozása') Futható futható = () -> {System.out.println ('belül: '+ Thread.currentThread (). GetName ())} System.out.println (' küldje be a futtatható által megadott feladatot a végrehajtószolgáltatásnak ') executorservice.submit (futtatható)}}
 Kimenet: Belül: fő létrehozó ExecutorService futtatható létrehozása küldje el a futható által megadott feladatot a végrehajtó szolgáltatásnak belül: pool-1-thread-1

A fenti bemutatja, hogyan hozhatunk létre ExecutorService-t és hajthatunk végre egy feladatot a végrehajtón belül. Ha egy feladatot végrehajtásra nyújtanak be, és a szál éppen egy másik feladat végrehajtásával van elfoglalva, akkor a feladat várakozni fog egy sorban, amíg a szál szabadon végrehajtja.

A fenti program futtatásakor a program soha nem fog kilépni. Ezt kifejezetten le kell állítania, mivel a végrehajtó szolgáltatás folyamatosan figyeli az új feladatokat.

Java ExecutorService megvalósítások

Az ExecutorService nagyon hasonlít egy szálkészlethez. Valójában az ExecutorService megvalósítása a java.util.concurrent fájlban csomag egy threadpool megvalósítás. Az ExecutorService a következő megvalósításokat tartalmazza a java.util.concurrent csomagban:

ThreadPoolExecutor

A ThreadPoolExecutor végrehajtja a megadott feladatokat az egyik belsőleg összevont szál segítségével.

ThreadPoolExecutor létrehozása

int corePoolSize = 5 int maxPoolSize = 10 hosszú keepAliveTime = 5000 ExecutorService threadPoolExecutor = új threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, új LinkedBlockingQueue ())

ScheduledThreadPoolExecutor

A java.util.concurrent.ScheduledThreadPoolExecutor egy ExecutorService, amely ütemezheti a feladatok késleltetés utáni futtatását, vagy az ismételt végrehajtást rögzített időközönként az egyes végrehajtások között.

Példa

ScheduledExecutorService scheduleexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture schedfuture = tervezettExecutorService.schedule (új hívható () {public Object call () dobja a (z) {System.out.println ('végrehajtva') 5 'visszatérés,' úgynevezett '}}} kivételt. MÁSODIK)

ExecutorService Használat

Néhányféle módon lehet feladatokat átruházni egy ExecutorService-re.

  • végrehajtani (Futható)

  • beküldés (futható)

  • invokeAny ()

  • invokeAll ()

Futtassa futható

A Java ExecutorService execute (Futható) lefoglal egy java.lang.Runnable objektumot, és aszinkron módon hajtja végre.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (új Runnable () {public void run () {System.out.println ('aszinkron feladat')}}) végrehajtóService.shutdown ()

Nincs mód a Runnable végrehajtásának eredményére, ehhez a Callable-t kell használni.

Runnable elküldése

A Java ExecutorService küldési (futtatható) metódus futtat egy futtatható megvalósítást, és visszaad egy jövőbeli objektumot. A jövőbeli objektum segítségével ellenőrizhető, hogy a Runnable befejezte-e a végrehajtást.

Future future = executorService.submit (új Runnable () {public void run () {System.out.println (: aszinkron feladat ')}}) future.get () // null értéket ad vissza, ha a feladat megfelelően befejeződött.

Hívható beküldése

A Java ExecutorService küldési (hívható) módszer hasonló a beküldéshez (futtatható), de a futtatható helyett a Java hívhatót veszi igénybe.

Jövőbeni jövő = végrehajtóSzolgáltatás.submit (új hívható () {nyilvános objektumhívás () dobja a Kivételt {System.out.println ('Asynchronous callable') return 'Hívható eredmény'}}) System.out.println ('future.get ( ) = 'jövő.get ()]
 Kimenet: Asynchroous callable future.get = Hívható eredmény

invokeAny ()

Az invokeAny () metódus hívható objektumok gyűjteményét veszi fel. Ennek a metódusnak a meghívása nem hoz jövőt, hanem az egyik Hívható objektum eredményét adja vissza.

ExecutorService végrehajtóService = Executors.newSingleThreadExecutor () készletcallable = új HashSet() callables.add (új Callable () {nyilvános karakterlánc-hívás () dobja a Kivételt {return'task A '}}}) callables.add (új Hívható () {public String-hívás () dobja a Kivételt {return'task B'} }) callables.add (új Callable () {public String call () dobja a kivételet {return'task C '}}) String eredmény = végrehajtóSzolgáltatás.invokeAny (hívható) System.out.println (' eredmény = '+ eredmény) végrehajtóSzolgáltatás .Leállitás()

A fenti kód futtatásakor az eredmény megváltozik. Lehet, hogy A feladat, B feladat és így tovább.

InvokeAll ()

Az invokeAll () metódus az összes paraméterként átadott Callable objektumot meghívja. Visszaadja azokat a jövőbeni objektumokat, amelyek felhasználhatók az egyes Callable-ok végrehajtásának eredményeinek megszerzésére.

ExecutorService végrehajtóService = Executors.newSingleThreadExecutor () készletcallable = új HashSet() callables.add (új Callable () {nyilvános karakterlánc-hívás () dobja a Kivételt {visszatérés 'A feladat'}}}) callables.add (új Hívható () {nyilvános karakterlánc-hívás () dobja a Kivételt {visszatérés 'B feladat'} }) callables.add (new Callable () {public String call () dobja a Kivételt {return 'C feladat'}}) listafutures = executorService.invokeAll (hívható) a (Future future: futures) {System.out.println ('future.get =' + future.get ())} végrehajtóService.shutdown ()

Futható vs hívható

A futható és hívható interfészek nagyon hasonlítanak egymásra. A különbség a interfészek. Mindkét felület olyan feladatot jelent, amelyet egy szál vagy az ExecutorService egyidejűleg hajthat végre.

Hívható nyilatkozat:

nyilvános felület Hívható {public object call () dob Kivételt}

Futható nyilatkozat:

nyilvános felület futható {public void run ()}

A fő különbség a kettő között az, hogy a call () metódus vissza tud adni egy objektumot a method hívásból. A call () metódus pedig dobhat egy míg a run () metódus nem.

hogyan állítsuk be az osztályútvonalat a Java-ban a parancssor használatával

feladat törlése

Az ExecutorService-hez benyújtott feladatot egyszerűen törölheti, ha egyszerűen meghívja a Cancel metódust a jövőben beküldött feladat benyújtásakor.

future.cancel ()

ExecutorService leállítás

Annak érdekében, hogy a szálak a futtatás befejezése után sem fussanak, állítsa le az ExecutorService alkalmazást.

Leállitás()

Az ExecutorService belsejében lévő szálak befejezéséhez hívja meg a shutdown () metódust.

executorService.shutdown ()

Ezzel a cikk végére jutunk, ahol megtanultuk, hogyan használhatjuk az ExecutorService alkalmazást egy szálon belüli feladatok végrehajtására. Remélem, tisztában van azzal, amit megosztott veled ebben az oktatóanyagban.

Ha relevánsnak találta ezt a cikket az „ExecutorService in Java” témában, nézze meg a egy megbízható online tanulási vállalat, amelynek több mint 250 000 elégedett tanulóból álló hálózata van az egész világon.

Azért vagyunk itt, hogy segítsünk az utazás minden lépésében, és kidolgozzunk egy tananyagot, amelyet olyan hallgatók és szakemberek számára tervezünk, akik Java fejlesztők szeretnének lenni. A tanfolyamot úgy tervezték meg, hogy előrelépést nyújtson a Java programozásban, és kiképezze mind az alapvető, mind a fejlett Java koncepciókra a különféle megoldásokkal együtt tetszik Hibernálás & .

Ha bármilyen kérdése merülne fel, nyugodtan tegye fel az összes kérdést az „ExecutorService in Java” megjegyzés rovatban, és csapatunk örömmel válaszol.