— Salom, Amigo! Elli senga iplar haqida aytdimi, men esa ular bilan qanday ishlash kerakligini aytaman. Yangi ip yaratish uchun:
1) Thread (ip) sinfini yaratamiz
2) Unga bajarilishi kerak bo'lgan metodni uzatayotgan obyektni o'tkazamiz
3) Yaratilgan Thread obyektida start metodini chaqiramiz.
Misol:
| Kod | Tavsif |
|---|---|
|
Interfeysi Runnableni amalga oshiradigan sinf. |
|
1 Printer sinfidagi obyekt yaratildi, unda run metod mavjud. 2 Yangi Thread sinfidagi obyekt yaratildi, unga konstruktorida printer obyektini uzatdik, uning run() metodi bajarilishi kerak. 3 Yangi ipni ishga tushirdik, start() metodini chaqirish orqali. |
Java dasturlaridagi kichik dasturlar odatda bitta ipdan iborat bo'lib, "asosiy ip" (main thread) deb nomlanadi. Ammo kattaroq dasturlar ko'pincha qo'shimcha iplarni ishga tushiradi, ular "qiz iplar" deb ham ataladi. Asosiy ip main metodini bajaradi va tugaydi. Ana shunday main metodiga o'xshash, qiz iplar uchun run metod interfeysi Runnable hisoblanadi.
— Ha, ko'p iplar, ko'p main metodlar.
— Thread obyektiga qaysi metoddan ish boshlashni ko'rsatish uchun, qandaydir usulda bu metodni ushbu obyektga o'tkazish kerak. Java-da bu Runnable interfeysi yordamida amalga oshiriladi. Bu interfeys bitta abstrakt metodi – void run()ni o'z ichiga oladi. Thread sinfi Thread(Runnable runnable) konstruktorga ega, unga Runnable interfeysi amalga oshirilgan har qanday obyektni o'tkazishingiz mumkin.
Siz o'z sinfingizni Runnable interfeysidan meros qilib olishingiz kerak, so'ngra o'z sinfingizda run metodini o'zgartiring. Aynan ushbu metod chaqirilishi bilan yangi ip ishga tushadi. Run metodda xohlagan narsani yozishingiz mumkin.
| Kod | Tavsif |
|---|---|
|
Interfeysi Runnable ni amalga oshiradigan sinf. |
|
Har biri o'z Printer turidagi obyektidan asoslangan ikkita ip yaratamiz. |
|
Bitta Printer obyektidan asoslangan uchta ip yaratamiz. |
Bundan tashqari, barchasini bitta sinfda birlashtirish mumkin. Thread sinfi Runnable interfeysidan meros qilgan, va uni usulni run o' Zgartirish kifoya:
| Yangi ip yaratishning ikkinchi usuli | |
|---|---|
|
Thread sinfidan meros oldik, u interfeysi Runnableni amalga oshiradi, va run metodini o'zgartirdik. |
|
O'z Printer turidagi obyektidan asoslangan ikkita ip yaratamiz. |
— Bu yechim chiroyliroq.
— Ha, lekin uning kamchiliklari bor:
1) Sizga "Natasha misolidagi" kabi bitta obyekt asosida bir nechta iplarni ishga tushirish kerak bo'lishi mumkin.
2) Agar siz Thread sinfidan meros qilib olgan bo'lsangiz, o'z sinfingizga yana bir ota-sinf qo'sha olmaysiz.
3) Agar sinfingiz ota-sinfga ega bo'lsa, unga ikkinchi sinf - Threadni qo'sha olmaysiz.
— Demak, har bir ip start metodini chaqirgandan so'ng unga konstruktorida uzatilgan obyektning run metodini bajarishga kirishadi?
— Ha. Agar konstruktorda hech narsa uzatilmagan bo'lsa, Thread o'zining ichki run metodini bajaradi.
— Nega bu metodni shunchaki chaqirib bo'lmaydi, masalan, shunday:
public static void main(String[] args)
{
Printer printer1 = new Printer("Kola");
printer1.run();
}
— Asosiy ip run metodi chegsa, bizning "kichik robotimiz", shunchaki ichiga kirib, ichidagi barcha buyruqlarni bajarishga kirishadi, va faqat ularni bajarib bo'lgandan so'ng, main metodiga qaytib, ishni davom ettiradi. Ikkinchi "kichik robotni" yaratish sodir bo'lmaydi, va barcha ish ketma-ket ravishda, emas bir vaqtning o'zida amalga oshiriladi.
— Xo'sh. Yana ikkita ipni chaqirish mumkinmi, run emas?
— Yo'q. Hammasi Runnable interfeysiga bog'liq, va u faqat o'z metodini — run biladi.
GO TO FULL VERSION