Executor
Executor — bu Runnable vazifalarni ishga tushirish uchun asosiy interfeys hisoblanadi. Bu vazifani qo'shish va uni qanday ishga tushirish haqida yordam beradi.
ExecutorService — bu interfeys Executorning xususiyatlarini kengaytiradi va Runnable yoki Callable vazifalarni ishga tushirish xizmatini ta'riflaydi. Submit metodlari vazifani Callable yoki Runnable sifatida qabul qiladi, va qaytariladigan qiymat Future bo'lib, u orqali natijani olishingiz mumkin.
invokeAll metodi vazifalarni bajarish, ularning holatini va natijalarini qaytarish uchun javobgardir.
invokeAny metodi muvaffaqiyatli bajarilgan vazifaning (ya'ni, istisno yaratmasdan) natijasini qaytarish uchun javobgardir, agar mavjud bo'lsa.
ScheduledExecutorService — bu interfeys kechiktirilgan yoki ma'lum bir davr bilan vazifalarni ishga tushirish imkoniyatini qo'shadi.
AbstractExecutorService — bu ExecutorService'ni qurish uchun abstrakt sinf. Ichida submit, invokeAll, invokeAny metodlarining implementatsiyalari mavjud. Bu sinfdan ThreadPoolExecutor, ScheduledThreadPoolExecutor va ForkJoinPool meros oladi.
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
Callable<String> task = () -> {
System.out.println(Thread.currentThread().getName()); // Joriy oqim nomini chiqarish
return Thread.currentThread().getName(); // Joriy oqim nomini qaytarish
};
scheduledExecutorService.schedule(task, 10, TimeUnit.SECONDS);
scheduledExecutorService.shutdown();
}
ThreadPoolExecutor
Executors — ThreadPoolExecutor, ScheduledThreadPoolExecutor yaratish uchun fabrika sinfi. Agar siz ushbu poollardan birini yaratishni istasangiz, bu fabrika aynan kerakli joy. Turli xil adapterlar mavjud: Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable va boshqalar. Har xil ThreadPool yaratish uchun statik metodlarga ega.
ThreadPoolExecutor — Executor va ExecutorService interfeyslarini amalga oshiradi va vazifa yaratish va uni bajarishni ajratadi. Bizga Runnable ob'ektlarini yaratish va ularni bajaruvchiga yuborish kerak, va ThreadPoolExecutor ularni bajarish, nusxalarini yaratish va oqimlar bilan ishlash uchun javobgar.
ScheduledThreadPoolExecutor — ThreadPoolExecutor metodlariga qo'shimcha ravishda, qaysi buyruklarni berilgan kechikishdan so'ng yoki davriy bajarish uchun rejalashtirishi mumkin bo'lgan oqim poolini yaratadi.
ThreadFactory — bu ob'ekt, kerak bo'lganda yangi oqimlar yaratadi. Bizga Executors.newSingleThreadExecutor(ThreadFactory threadFactory) metodiga ekzemplar uzatish kerak.
ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override public Thread newThread(Runnable r) {
Thread thread = new Thread(r, "MyThread");
thread.setPriority(Thread.MAX_PRIORITY);
return thread; }
});
RejectedExecutionHandler — bu ThreadPoolExecutor orqali biron sababga ko'ra bajarilmaydigan vazifalar uchun ishlovchini aniqlash imkonini beradi. Bu, bo'sh oqimlar mavjud bo'lmaganda yoki xizmat o'chirilganda yoki o'chirilgan (shutdown) holatlarda yuz beradi.
Birinchi qatorli implementatsiyalar ThreadPoolExecutor sinfida mavjud:
- CallerRunsPolicy — vazifani chaqiruvchi oqimda ishlaydi;
- AbortPolicy — istisno tashlaydi;
- DiscardPolicy — vazifani e'tiborsiz qoldiradi;
- DiscardOldestPolicy — navbatdagi eng eski boshlanmagan vazifani olib tashlaydi, keyin yangi vazifani qayta qo'shishga urinadi.
Completion Service
CompletionService — bu asinxron vazifalarni ishga tushirish va natijalarni olishni ajratib beruvchi xizmat interfeysi. Vazifalar qo'shish uchun submit metodi mavjud, allaqachon tugallangan vazifalar natijalarini olish uchun blokirovka qiluvchi take va blokirovka qilmaydigan poll metodlari ishlatiladi.
ExecutorCompletionService — bu Executor interfeysini amalga oshiradigan har qanday sinfning o'ramidir, masalan, ThreadPoolExecutor yoki ForkJoinPool. Vazifalarni ishga tushirish va ularni amalga oshirishni nazorat qilish usulidan abstraktsiyalash kerak bo'lsa foydalaniladi.
Agar to'ldirilgan vazifalar mavjud bo'lsa, ularni chiqarib olamiz. Agar vazifalar bo'lmasa, biror narsa tugallanmaguncha take ichida osilib qolamiz. Xizmat asosida LinkedBlockingQueue ishlatiladi, ammo siz har qanday BlockingQueue implementatsiyasini uzatishingiz mumkin.
GO TO FULL VERSION