ThreadPoolExecutor – 1

"A hétköznapi programozók előbb-utóbb rájönnek, hogy sok apró feladatuk van, amelyeket időnként végre kell hajtani."

"Ha játékot írsz, akkor az egyes karakterek által végrehajtott cselekvések."

"Ha webszervert írsz, akkor különböző parancsok érkeznek a felhasználóktól: tölts fel egy fotót, kódolj át a kívánt formátumba, alkalmazd a kívánt sablont stb."

"Előbb vagy utóbb minden nagy feladat kis, kezelhető feladatsorra bomlik."

"Tehát ebben a kontextusban felvetődik egy finom kérdés: hogyan kell mindegyiket kezelni? Mi van, ha több száz feladatot kell végrehajtania egy perc alatt? Nem sok értelme lenne minden feladathoz egy szálat létrehozni. A Java gép elég sok erőforrást különít el minden szálhoz."

"Más szóval egy szál létrehozása és megsemmisítése több időt és erőforrást igényelhet, mint maga a feladat."

"A Java alkotói egy elegáns megoldást találtak ki erre a problémára: ThreadPoolExecutor .

" A ThreadPoolExecutor egy olyan osztály, amelyben két dolog van:"

A)  Feladatsor, amelyhez a programban felmerülő feladatokat felveheti.

B) Egy szálkészlet, amely szálak csoportja, amely ezeket a feladatokat hajtja végre.

"Sőt, a szálak nem pusztulnak el, ha egy feladat befejeződik. Ehelyett elalszik, hogy készen álljanak egy új feladat megkezdésére, amint az megjelenik."

"A ThreadPoolExecutor létrehozásakor beállíthatja a létrehozandó szálak maximális számát és a sorba helyezhető feladatok maximális számát. Más szavakkal, korlátozhatja például a szálak számát 10-re, és a szálak számát. sorba állította a feladatokat 100-ra."

"Így működik a ThreadPoolExecutor :"

1)  Amikor új feladatot ad hozzá, az a sor végére kerül.

2)  Ha a sor megtelik, kivételt dob ​​a rendszer.

3)  Egy feladat befejezésekor minden szál átveszi a következő feladatot a sorból, és megkezdi annak végrehajtását.

4) Ha nincs feladat a sorban, egy szál alvó állapotba kerül, amíg új feladatokat nem adnak hozzá.

"Az a megközelítés, hogy korlátozzuk a dolgozói szálak számát, abból a szempontból előnyös, hogy minél több szálunk van, azok annál jobban zavarják egymást. Sokkal hatékonyabb az 5-10 dolgozó szál és a hosszú feladatsor, mint 100 szál létrehozása a rengeteg feladathoz, amelyek versenyezni fognak egymással az erőforrásokért: memória, processzoridő, adatbázis-hozzáférés stb.

"Íme egy példa a ThreadPoolExecutor működésére:"

Példa
ExecutorService service = Executors.newFixedThreadPool(2);

for(int i = 0; i < 10; i++)
{
 service.submit(new Runnable() {
    public void run()
    {
     // Here we download something big from the Internet.
    }
 });
}

– Jaj, én nem látom…

"A newFixedThreadPool metódus meghívásakor ThreadPoolExecutor objektum jön létre."

Tehát nagyon könnyen használható. Amint hozzáad egy feladatot a küldési metódussal, az:

A)  Felébreszt egy alvószálat, ha van, a feladat végrehajtásához.

B)  Ha nincs várakozó szál, akkor újat hoz létre a feladathoz.

C)  Ha eléri a szálak maximális számát, akkor egyszerűen a sor végére teszi a feladatot.

"Szándékosan beépítettem a példába az "itt letöltünk valami nagyot az internetről" szót. Ha van 100 feladatunk, hogy "töltsünk le valami nagyot az internetről", akkor nincs értelme sokat futtatni egyszerre. visszatartja az internetkapcsolatunk sávszélesség-korlátja. Ebben az esetben néhány szálnak elegendőnek kell lennie. Ezt látja a fenti példában:"

ExecutorService service = Executors.newFixedThreadPool(2);

– Kiderült, hogy egy csomó feladattal nem is olyan nehéz dolgozni.

"Igen. Még könnyebben, mint gondolnád. De Kim elmondja neked ezt."