ThreadPoolExecutor

All lectures for UZ purposes
Daraja, Dars
Mavjud

Odatda, multithread ilova ishlab chiqayotganda, biz oqimlar ishini tashkil qilish bilan duch kelamiz. Ilovamiz qanchalik katta bo'lsa va bizga multithread vazifalarni amalga oshirish uchun qancha oqim kerak bo'lsa, shuncha ko'p Runnable obyektlarini yaratamiz.

Bu yerda ta'kidlash lozimki, Java'da oqim yaratish — ancha qimmat operatsiya. Agar biz har safar operatsiyani bajarish uchun yangi oqim nusxasini yaratadigan bo'lsak, katta unumdorlik muammolariga duch kelamiz va oxir-oqibat ilovaning ishlash qobiliyatida muammolar paydo bo'ladi.

Bu holatda bizga Thread pool (oqimlar puli) va ThreadPoolExecutor yordamga keladi.

Thread pool — bu oldindan ishga tushirilgan oqimlar to'plami bo'lib, uning hajmi statsionar yoki o'zgaruvchan bo'lishi mumkin.

Agar vazifalar oqimlardan ko'proq bo'lsa, vazifalar navbatda kutadi (Task Queue). Navbatdan vazifa N-oqimga topshiriladi va vazifa bajarilgandan keyin oqim navbatdan yangi vazifani oladi. Navbatdagi barcha vazifalar bajarilgandan so'ng, oqimlar faol holatda yangilarini kutadi. Vazifalar paydo bo'lganda, oqimlar ularni ham bajarishga kirishadi.

ThreadPoolExecutor

Java 5 versiyasidan boshlab, multithreading masalalarini hal qilishda Executor framework paydo bo'ldi. Umuman olganda, u ko'plab komponentlarga ega va u navbat va oqimlar puli boshqaruvini samarali amalga oshirish muammosini hal qilish uchun keldi.

Asosiy interfeyslar — Executor va ExecutorService.

Executor — bu yagona metodga ega interfeys bo'lib, void execute(Runnable runnable) mavjud.

Bu metodning amalga oshirilishiga vazifa topshirsangiz, biling-ki: u kelajakda asinxron bajariladi.

ExecutorService — bu Executor interfeysidan meros qolgan interfeys bo'lib, vazifalarni bajarish imkoniyatlarini taqdim etadi. Shuningdek, unga bajarilayotgan vazifani to'xtatish va oqimlar puli ishini yakunlash metodlari ham kiradi.

ThreadPoolExecutor interfeyslarni amalga oshiradi: Executor va ExecutorService va vazifaning yaratilishi va uning bajarilishini ajratadi. Bizning vazifamiz - Runnable obyektlarini amalga oshirish va ularni ijrochiga yuborish, ThreadPoolExecutor esa ularni bajarish, nusxalarini yaratish va oqimlar bilan ishlash uchun javobgar.

Vazifa bajarishga yuborilgandan so'ng, polda mavjud oqim ishlatiladi. Shu bilan, yangi oqim yaratish va ishga tushirish uchun resurslar sarf qilish masalasi hal etiladi va undan foydalanilgandan so'ng, uni GC tozalab, unumdorlik oshiriladi.

ThreadPoolExecutor 4 ta konstruktorni ichiga oladi:


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)
    

Konstruktor ThreadPoolExecutor parametrlari quyidagilar:

corePoolSize Parametr, qaysi oqimlar soni boshlanganda (start) executor xizmatida tayyor (ishga tushirilgan) bo'lishini ko'rsatadi.
maximumPoolSize Executor xizmatida yaratilishi mumkin bo'lgan maksimal oqimlar soni.
keepAliveTime Bo'shagan oqim qaysi muddat davomida yashay olishi va corePoolSize ortiq bo'lgan hollarda keyin yo'q qilinishi mumkinligi. Vaqt birliklari quyidagi parametrda ko'rsatiladi.
unit Vaqt birliklari (soat, daqiqa, soniya, milliyasekund va boshqalar).
workQueue Vazifalar uchun navbatning amalga oshirilishi.
handler Bajaraq olinmagan vazifalarning ishlovchilarini aniqlash.
threadFactory Yangicha oqimlarni talablarga muvofiq yaratadigan obyekt. Oqimlar fabrikalarini ishlatish yangi oqimlarga qo'ng'iroqlarni moslashtirishni bartaraf etadi, ilovalarga maxsus oqimlar, ustuvorliklar va h.k. ishlatish imkonini beradi.

ThreadPoolExecutor yaratish

ThreadPoolExecutor yaratishni bizga Executors nomli utilitar klass soddalashtirib beradi. Ushbu utilitar klassda ThreadPoolExecutor obyekti tayyorlashda yordam beradigan metodlar mavjud.

newFixedThreadPool — har qanday miqdordagi vazifalarni bajarish uchun aniqlangan miqdordagi oqimlardan qayta foydalanadigan oqimlar puli yaratadi.

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool – oqimlar puli yaratadi, qaerda oqimlar soni = JVM uchun mavjud bo'lgan protsessor yadro soni. Standart parallelizm darajasi – bir. Bu shuni anglatadiki, o'zgaruvchan parallelizm bilan ko'p yadroli protsessorlar uchun JVM mavjud yadro soni miqdorida oqimlar yaratiladi. Agar parallelizm 4 ga teng bo'lsa, demak, yadro soni o'rniga berilgan qiymat ishlatiladi.

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor – barcha vazifalarni bajarish uchun yagona oqimga ega bo'lgan pul yaratadi.

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool – zaruratga muvofiq yangicha oqimlarni yaratuvchi, lekin mavjud oqimlar bo'shagandan so'ng ulardan qayta foydalanadigan oqimlar puli yaratadi.

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool – ma'lum bir kechikishdan so'ng yoki doimiy ravishda bajarilgan buyruqlarni rejalashtiradigan oqimlar puli yaratadi.

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

Har bir turdagi pulllarni keyingi ma'ruzalarda ko'rib chiqamiz.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION