JavaRush /Kurslar /All lectures for UZ purposes /Стратегия «wait-notify-notifyAll»

Стратегия «wait-notify-notifyAll»

All lectures for UZ purposes
Daraja, Dars
Mavjud
Стратегия «wait-notify-notifyAll» - 1

— Salom, Amigo!

Sen bilan wait-notify mavzusini yaxshi tushuntirmoqchiman. wait-notify metodlari tredlar o‘rtasidagi o‘zaro harakatni yaxshilash mexanizmini ta'minlaydi. Ularni murakkab yuqori darajadagi tredlar o‘rtasidagi aloqalarning qurilishiga ham foydalanish mumkin.

Kichik bir misoldan boshlayman. Bizda server uchun dastur bo‘lsin, foydalanuvchilar sayt orqali qo‘shadigan turli vazifalarni bajarishi kerak bo‘lgan. Foydalanuvchilar turli vazifalarni turli vaqt oralig‘ida qo‘shishadi. Vazifalar resurslarni ko‘p talab qiladi, lekin bizning serverimizda sakkiz yadrovli protsessor bor — bu ishni uddalasa bo‘ladi. Qanday qilib vazifalarni serverda bajarish mumkin?

Birinchidan, biz tarmoq ishchilar guruhi yaratamiz, protsessor yadro soni miqdoricha. Har bir tarmoq o‘z yadroda ishlashi mumkin: tarmoq bir-biriga halaqit qilmaydi va protsessor yadrolari ishda bo‘lmaydi.

Ikkinchidan, foydalanuvchilardan kelib turgan buyruqlar tashqi ob’ekti yaratamiz. Har xil buyruqlar turlari turli ob’ektlarga mos keladi, lekin ularning barchasi Runnable interfeysini amalga oshiradi, shuning uchun ularni bajarish mumkin bo‘ladi.

— Shu kabi buyruq-ob'ekti misolini keltirar mikan?

— Mana, qarang:

Bu sinf run() metodi chaqirilganda n sonining faktorialini hisoblaydi
class Factorial implements Runnable
{
 public int n = 0;
 public long result = 1;

 public Factorial (int n)
 {
  this.n = n;
 }

 public void run()
 {
  for (int i=2;i<=n;i++)
   result*=i;
 }
}

— Хозирча тушунарли.

— Zo‘r. Unda, buyruq tashqi ob’ekti qanday ko‘rinishida bo‘lishi kerakligini ko‘rib chiqamiz. Nima deya olasan?

— U thread-safe bo‘lishi kerak. Unda, buyruq ob’ektlari (tasks) foydalanuvchilardan qabul qilgan tarmoq tomonidan joylashtiriladi, natijada buyruqlarni bajaruvchi tarmoqlar tomonidan olinadi.

— Ha. Agar buyruqlar vaqtinchalik tamom bo‘lsa-chi?

— Unda buyruq bajaruvchi tarmoq ularni paydo bo‘lishini kutishi kerak.

— To‘g‘ri. Tasavvur qil, bularning barchasini bir o‘ziga xos tashqi ob’ektga joylashtirish mumkin. Mana, qara:

Agar buyruqlar tugagan bo‘lsa, tarmoq uyquga ketadi va ularning paydo bo‘lishini kutadi:
public class JobQueue
{
 ArrayList jobs = new ArrayList();

 public synchronized void put(Runnable job)
 {
  jobs.add(job);
  this.notifyAll();
 }

 public synchronized Runnable getJob()
 {
  while (jobs.size()==0)
   this.wait();

  return jobs.remove(0);
 }
}

Bizda getJob metodi bor, agar ish ro‘yxati (jobs) bo‘sh bo‘lsa, tarmoq uxlaydi (wait), to ro‘yxatda nimadir paydo bo‘lguncha.

Bundan tashqari, ro‘yxatga yangi buyruq (job) qo‘shish imkonini beruvchi put metodi mavjud. Yangi buyruq qo‘shilgandan so‘ng, notifyAll metodi chaqiriladi. Ushbu metod, getJob metodining ichida uxlab qolgan bajaruvchi tarmoqlarni uyg‘otadi.

— Yana bir marta eslatib berasizmi, wait va notify metodlari qanday ishlaydi?

— wait metodi faqat synchronized blok ichida, muteks ob’yekti bilan chaqiriladi. Bizning holatda – bu this. Bu ikki narsani amalga oshiradi:

1) Tarmoq uxlaydi.

2) Tarmoq vaqtincha muteksni bo‘shaydi (uyg‘onmaguncha).

Bundan so‘ng boshqa tarmoqlar synchronized blokiga kirishi va xuddi shu muteksni egallashi mumkin.

notifyAll metodi ham faqat synchronized blok ichida muteks ob’yekti bilan chaqirilishi mumkin. Bizning holatda – bu this. Bu ikki narsani amalga oshiradi:

1) Shu muteks ob’yektida uxlab yotgan barcha tarmoqlar uyg‘onadi.

2) Joriy tarmoq synchronized blokdan chiqqach, uyg‘ongandan bir tarmoq muteksni egallaydi va ishini davom ettiradi. U muteksni bo‘shatganda, yana uyg‘ongan bir tarmoq muteksni egallaydi va hokazo.

Bu juda avtobusga o‘xshaydi. Siz ichkariga kirib, yo‘l haqi uzatmoqchi bo‘lasiz, lekin haydovchi yo‘q. Va siz "uyqu" ga ketasiz. Vaqt o‘tishi bilan butun avtobus to‘lib ketadi, lekin hali yo‘l haqini hech kim uzatmaydi – uzatadigan odam yo‘q. Keyin esa haydovchi kirib keladi, siz " – Yo‘l haqini uzatamiz" eshitasiz. Va bu ish boshlanadi…

— Qiziqarli taqqoslash. Avtobus nima?

— Bu Xulio aytgan. 21-asrda bunday g‘alati narsalar bor edi.

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