Többszálú alkalmazás fejlesztésénél általában a szálak munkájának szervezésével kell foglalkoznunk. Minél nagyobb az alkalmazásunk és minél több szálra van szükségünk a többszálú feladatokhoz, annál többFuthatóaz általunk létrehozott objektumok.

Itt meg kell jegyezni, hogy a szál létrehozása Java-ban meglehetősen költséges művelet. Ha minden alkalommal létrehozunk egy új szálpéldányt egy művelet végrehajtásához, akkor nagy problémákat okozunk a teljesítménnyel, és ennek eredményeként az alkalmazás állapotával.

Itt egy szálkészlet és a ThreadPoolExecutor jön a segítségünkre.

A szálkészlet előre inicializált szálak halmaza. Mérete lehet fix vagy változó.

Ha több feladat van, mint szál, akkor a feladatok egy feladatsorban várakoznak. A készlet N-edik szála átvesz egy feladatot a sorból, és miután ez megtörtént, a szál új feladatot vesz fel a sorból. Miután a sorban lévő összes feladat végrehajtásra került, a szálak aktívak maradnak, és várnak az új feladatokra. Amikor új feladatok jelennek meg, a szálak azokat is végrehajtják.

ThreadPoolExecutor

A Java 5-től kezdve az Executor keretrendszer többszálú megoldást kapott. Általában sok összetevőből áll, és célja, hogy segítsen nekünk a várólisták és szálkészletek hatékony kezelésében.

A fő felületek az Executor és az ExecutorService .

Az Executor egy felület egyetlen void execute (Futtatható futtatható) metódussal.

Amikor átad egy feladatot ennek a módszernek a megvalósításához, vegye figyelembe, hogy a jövőben aszinkron módon fog végrehajtani.

ExecutorService – Olyan interfész, amely kiterjeszti az Executor felületet, és funkciókat ad hozzá a feladatok végrehajtásához. Ezenkívül rendelkezik egy futó feladat megszakítására és a szálkészlet leállítására szolgáló módszerekkel is.

A ThreadPoolExecutor megvalósítja az Executor és ExecutorService felületeket, és elválasztja a feladat létrehozását a feladat végrehajtásától. Meg kell valósítanunk a futtatható objektumokat, és el kell küldenünk őket egy végrehajtónak. A ThreadPoolExecutor ezután felelős a feladatok végrehajtásáért, valamint a szálak létrehozásáért és a velük való munkavégzésért.

Egy feladat végrehajtásra küldése után a rendszer egy meglévő szálat használ a készletben. Ez javítja a teljesítményt. Megoldja az erőforrások pazarlásának problémáját egy új szál létrehozására és inicializálására, majd ismét a szemétgyűjtésre, ha végeztünk a szállal.

A ThreadPoolExecutor 4 konstruktorral rendelkezik:


ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)
    

A ThreadPoolExecutor konstruktor a következő paraméterekkel rendelkezik:

corePoolSize Ez a paraméter azt jelzi, hogy hány szál lesz készen (elindulva), amikor a végrehajtó szolgáltatás elindul.
maximumPoolSize A végrehajtó szolgáltatás által létrehozható szálak maximális száma.
KeepAliveTime Az az idő, ameddig egy felszabadult szál tovább él, mielőtt megsemmisülne, ha a szálak száma nagyobb, mintcorePoolSize. Az időegységeket a következő paraméter határozza meg.
Mértékegység Időegységek (óra, perc, másodperc, ezredmásodperc stb.).
workQueue Feladatok sorának megvalósítása.
kezelő Kezelő olyan feladatokhoz, amelyeket nem lehet elvégezni.
threadFactory Egy objektum, amely igény szerint új szálakat hoz létre. A szálgyárak használata függetlenné teszi az új szálak hívásait, lehetővé téve az alkalmazások számára speciális szálalosztályok, prioritások stb. használatát.

ThreadPoolExecutor létrehozása

Az Executors segédprogram leegyszerűsítheti a ThreadPoolExecutor létrehozását . Ennek a segédosztálynak a metódusai segítenek elkészíteni aThreadPoolExecutortárgy.

newFixedThreadPool — Létrehoz egy szálkészletet, amely meghatározott számú szálat használ fel tetszőleges számú feladat végrehajtásához.

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool — Létrehoz egy szálkészletet, ahol a szálak száma megegyezik a JVM számára elérhető processzormagok számával. Az alapértelmezett párhuzamossági szint egy. Ez azt jelenti, hogy annyi szál jön létre a készletben, ahány CPU mag elérhető a JVM számára. Ha az egyidejűségi szint 4, akkor az átadott érték kerül felhasználásra a magok száma helyett.

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor — Egyetlen szálból álló készletet hoz létre az összes feladat végrehajtásához.

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool – Létrehoz egy szálkészletet, amely szükség szerint új szálakat hoz létre, de a korábban létrehozott szálakat újra felhasználja, ha azok elérhetők.

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool – Létrehoz egy szálkészletet, amely ütemezheti a parancsok adott késleltetés utáni vagy időszakos végrehajtását.

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

A következő leckékben az egyes medencetípusokat megvizsgáljuk.