— Salom, Amigo! Tan ol, Elly bu Cancel bilan yaxshi fikr keldi, a?
— Ha, shunday.
— Aslida Thread sinfida bunga o'xshash narsa mavjud. Faqat o'zgaruvchi isCancel emas, isInterrupted deb nomlanadi va to'xtatish metodi mos ravishda cancel() emas, interrupt().
— Haqiqatdanmi?
— Ha. Mana, qarang:
| Kod | Tavsif |
|---|---|
|
Ko'plab threadlar bitta obyektning run metodini chaqira olganligi sababli, Clock obyekt run metodida uni chaqirgan thread obyektini oladi («joriy thread»). Clock sinfi (soatlar) uning isInterrupted o'zgaruvchisi false bo'lgunga qadar har bir soniyada "Tik" so'zini konsolga yozadi. isInterrupted o'zgaruvchisi true bo'lsa, run metodi tugaydi. |
|
Asosiy thread, soat bo'lgan bir filial threadini ishga tushiradi, u abadiy ishlashi kerak. 10 soniya kutadi va topshiriqni interrupt metodi orqali bekor qiladi. Asosiy thread o'z ishini tugatadi. Soatlar threadi o'z ishini tugatadi. |
Bundan tashqari, run metodidagi abadiy siklni tashkil qilish uchun ko'p ishlatiladigan sleep metodida avtomatik isInterrupted o'zgaruvchisini tekshirish mavjud. Agar thread sleep metodini chaqirsa, bu metod oldin tekshiradi, hozirgi (uni chaqirgan thread) isInterrupted o'zgaruvchisi true bo'ladimi yoki yo'qmi. Agar o'rnatilgan bo'lsa, metod uxlamaydi, balki InterruptedException xatosini chiqaradi.
— Nega xato chiqarish kerak? Shunchaki siklda isCancel o'rniga isInterrupted()ni qo'yish yaxshiroq emasmi?
— Birinchidan, run metodida har doim sikl bo'lmasligi mumkin. Metod faqat boshqa metodlarning yigirmata chaqirig'idan iborat bo'lishi mumkin. Keyin har bir chaqiruvdan oldin isInterrupted ni tekshirishni qo'shish kerak bo'ladi.
Ikkinchidan, qaysidir metod juda uzoq davom etadigan bo'lsa, chunki u ko'plab turli harakatlarni bajaradi.
Uchinchidan, xatolik chiqarish isInterrupted tekshiruvi o'rnini bosuvchi emas, balki qulay qo'shimcha. Chiqarilgan xato chaqiruvlar stekini tezda run gacha qaytarishga imkon beradi.
To'rtinchidan, sleep metodi ko'p ishlatiladi va, natijada, foydali metodga yashirin foydali tekshirish qo'shildi. Go'yoki hech kim maxsus tekshiruv qo'shmagan edi, lekin u bor. Siz ko'p begona kodni ishlatganda va unga tekshirishni qo'sha olmaganda bu juda qadrli.
Beshinchidan, qo'shimcha tekshirish ishlashni pasaytirmaydi. Sleep metodini chaqirish thread hech narsa qilmasligi (uxlashi) kerakligini bildiradi, shuning uchun qo'shimcha ish hech kimga to'sqinlik qilmaydi.
— Jiddiy dalillar.
— Va nihoyat, oxirgisi: siz o'z run metodingizda begona kodni chaqirishingiz mumkin, sizda unga kirish (manba kodlari va/yoki ularni o'zgartirish huquqi) yo'q. U isInterrupted ga tekshiruvlarni o'z ichiga olmaydi va barcha xatolarni try...catch(Exception e) yordamida ushlaydi.
Hech kim threadni to'xtatishni kafolatlay olmaydi. U faqat o'zi to'xtashi mumkin.
GO TO FULL VERSION