Többszálú programozás java 8


Üdvözöljük az első része a párhuzamos programozás Java útmutató 8. Ebben a részben, úgy véljük, egyszerű példát, hogyan kell végrehajtani kód párhuzamosan szálak, feladatait és szolgáltatási előadók.
Ez az első alkalom Concurrency API került bevezetésre, melynek megjelenése Java 5 és azóta fejlődött minden új Java verziót. A legtöbb példa lehet megvalósítani régebbi verziói, de ebben a cikkben fogom használni lambda kifejezés. Ha még mindig nem ismerik a fejlesztések Java 8, azt ajánlom, hogy nézd meg a kalauz.
Áramlások és feladatok
Minden modern operációs rendszer támogatja a párhuzamos végrehajtását kódot a folyamatok és szálak. A folyamat - egy példánya a program fut a többitől függetlenül. Például, ha egy olyan programot futtat a Java, az operációs rendszer létrehoz egy új folyamat, amely párhuzamosan fut a többiek. Bent a folyamatokat használjuk flow, ezáltal kisakkozni a processzor kapacitása.
Streams (szálak) támogatott Java óta JDK 1.0. Mielőtt elkezdené a szál, szükséges, hogy egy kódrészlet, ami általában úgynevezett „objektív» (feladat). Ez úgy történik, végrehajtási futtatható felületen. amely csak az egyik módszer nem érv, visszatér void - run (). Íme egy példa arra, hogyan működik ez:
Ha ezt a kódot, akkor megjelenik egy másodperces késleltetés közötti kimenete az első és a második sor a képernyőn. TimeUnit - hasznos osztályának dolgozó időegységek, de ugyanez lehet tenni Thread.sleep (1000).
Vegyünk most egy közelebbi pillantást az egyik legfontosabb része a Concurrency API - végrehajtási szolgálat (hagyatéki szolgáltatások).
művészek
Egyidejű API bevezeti a szolgáltatás fogalma a végrehajtó (ExecutorService) - egy magas szintű csere szálak közvetlenül. Művészek feladatok elvégzésére aszinkron általában használ egy szál medence, így nem kell létrehozni őket kézzel. Az összes szál a medencében, hogy újra felhasználható, miután a feladatot, ami azt jelenti, hogy létre, mint sok feladatot az alkalmazás, mint szeretnénk, segítségével az egyik előadó.
Itt van, hogyan fog kinézni az első példa a művész:
ExecutorService executor = Végrehajtók. newSingleThreadExecutor ();
végrehajtó. benyújtja (() ->
Húr threadName = Szál. currentThread (). getName ();
Rendszer. ki. println ( "Jó napot" + threadName);
// => Szia pool-1-thread-1
Végrehajtók osztály kényelmes gyári módszerek létrehozása a különböző művészek szolgáltatásokat. Ebben az esetben mi használt előadóművész egy szál.
Az eredmény ugyanúgy néz ki, mint legutóbb. Azonban ez a kód van egy fontos különbség - akkor soha nem hagyja abba. végrehajtása elvégzéséhez szükséges munkamennyiség világosan. Ehhez ExecutorService felület két módszer: leállítás (). amely megvárja az üzemeltetési feladatokat, és shutdownNow (). amely leállítja az énekes azonnal.
Itt van, hogyan Inkább abba az énekesek:
A fenti példában használt másik típusú előadóművészek, ami által létrehozott eljárás newWorkStealingPool (). Ez a módszer megjelent Java 8 és nem úgy viselkedik, mint a többi: ahelyett, hogy egy előre meghatározott számú szálat hoz létre ForkJoinPool bizonyos párhuzamosság (párhuzamosság méret). alapértelmezés szerint a számos gépi magot.
ForkJoinPool először a Java 7 és áttekintjük azt részletesebben a következő fejezetekben a menedzsment. Most nézzük meg a szereplők egy ütemező (menetrend végrehajtók).
Művészek egy ütemező
Azt már tudjuk, hogyan kell adni a feladatot végrehajtó és kap az eredmény. Annak érdekében, hogy rendszeresen futtatja a feladatot, fel tudjuk használni a menet medence egy ütemező.
ScheduledExecutorService képes futtatni feladatok egy vagy több alkalommal, egy előre meghatározott intervallumban.
Ez a példa azt mutatja, hogyan lehet eljutni az énekes, hogy egy feladatot három másodperc után: