JavaRush /Kurslar /All lectures for UZ purposes /wait, notify, notifyAll metodlari bilan tanishuv

wait, notify, notifyAll metodlari bilan tanishuv

All lectures for UZ purposes
Daraja, Dars
Mavjud

— Salom, Amigo!

— Salom, Risha!

— Men seni wait, notify, notifyAll metodlari bilan tanishtiraman.

Bugun faqat ular bilan tanishamiz, lekin keyinchalik ularga yana qaytib, ularga ko'proq vaqt ajratamiz.

— Yaxshi.

— Bu metodlar tarmoqlarni sinxronlashtirish mexanizmining bir qismi sifatida o'ylab topilgan.

Eslatib o'taman, Java dasturida umumiy resurslarga (obyektlarga) har xil tarmoqlardan kirishni boshqarish uchun o'rnatilgan mexanizm mavjud. Tarmoq biror ob'ektni band deb e'lon qilishi mumkin va boshqa tarmoqlar band ob'ekt bo'shaguncha kutishga majbur bo'ladi.

— Men eslayman, bu synchronized kalit so'zi yordamida amalga oshiriladi.

— To'g'ri. Odatda bunday kod taxminan shunday ko'rinadi:

public void print()
{
 Object monitor = getMonitor();
 synchronized(monitor)
 {
  System.out.println("text");
 }
}

Buni qanday ishlashini eslaysanmi?

— Ha. Agar ikkita tarmoq bir vaqtda print() metodini chaqirsa, ulardan biri synchronized bilan belgilanglagan blokga kiradi va monitorni bloklaydi, shuning uchun ikkinchi tarmoq monitor bo'shatilmaguncha kutadi.

— To'g'ri. Tarmoq synchronized bilan belgilanglagan blokka kirishi bilan ob'ekt-monitor band deb belgilanadi va boshqa tarmoqlar monitor ob'ekti bo'shatilishini kutishga majbur bo'ladi. Bir xil ob'ekt-monitor dastur turli qismlarida ishlatilishi mumkin.

— Aytmoqchi, nima uchun monitor?

— Monitor deb holatni saqlaydigan (band/bo'sh) ob'ektni atashadi.

Bu erda wait va notify metodlari ishga tushadi.

Aslida, metodlar faqat ikkita. Qolganlari esa shu metodlarning modifikatsiyalari.

Endi wait metod nima va u nima uchun kerak.

Ba'zan dasturda shunday vaziyat bo'lishi mumkinki, tarmoq synchronized kod blokiga kirib, monitorni bloklaydi va ma'lum ma'lumotlar yetishmagani uchun ishlay olmaydi: masalan, u ishlov berishi kerak bo'lgan fayl hali yuklanmagan.

Biz esa fayl yuklanishini kutishimiz mumkin. Shunchaki tsiklda tekshirsa bo'ladi — agar fayl hali yuklanmagan bo'lsa — misol uchun, bir soniya uxlab, yana tekshirish va h.k.

Taxminan shunday:

while(!file.isDownloaded())
{
 Thread.sleep(1000);
}
processFile(file);

Lekin bizning holatda bunday kutish juda qimmat. Chunki bizning tarmoq monitorni bloklagan, boshqa tarmoqlar ham kutishga majbur, garchi ularning ma'lumotlari ishlashga tayyor bo'lishi mumkin.

Ushbu muammoni hal qilish uchun wait() metodi o'ylab topilgan. Ushbu metodni chaqirish natijasida tarmoq monitorni bo'shatadi va «pauzaga tushadi».

Wait metodini faqat monitor ob'ekti ustida va faqat monitor band bo'lganda chaqirish mumkin — ya'ni synchronized blok ichida. Shu bilan birga, tarmoq vaqtincha ishini to'xtatadi va monitor boshqa tarmoqlar foydalanishi uchun bo'shatiladi.

Ko'pincha synchronized blokiga tarmoq kiradi, wait chaqiradi va monitorni bo'shatadi.

Keyin ikkinchi tarmoq kiradi va pauzaga o'tadi, keyin uchinchi va hokazo.

— Va qanday qilib tarmoq pauzadan chiqariladi?

— Buning uchun ikkinchi metod — notify mavjud.

notify/notifyAll metodlarini monitor ob'ekti ustida va faqat monitor band bo'lganda chaqirish mumkin — ya'ni synchronized blok ichida. notifyAll metodi ushbu monitor ob'ekti bilan pauzaga tushgan barcha tarmoqlarni pauzadan chiqaradi.

notify metodi bir tasodifiy tarmoqni «muzdan chiqaradi», notifyAll metodi esa ushbu monitor ob'ektiga bog'liq barcha «muzda» tarmoqlarni chiqaradi.

— Juda qiziqarli, rahmat Risha.

— Sen uchun qiziqarli bo'lishidan xursandman, Amigo!

Wait metodining yana bir qancha modifikatsiyalari bor:

wait() metodi Izoh
void wait(long timeout)
Tarmoq «muzlaydi», lekin ko'rsatilgan millisekundli miqdor o'tgandan keyin avtomatik «muzdan chiqaradi».
void wait(long timeout, int nanos)
Tarmoq «muzlaydi», lekin ko'rsatilgan millisekundli va nanoskundli miqdor o'tgandan keyin avtomatik «muzdan chiqaradi».

Bu, wait metodining timeoutli shakli hisoblanadi. Metod oddiy wait kabi ishlaydi, lekin agar ko'rsatilgan vaqt o'tsa va hech kim tarmoqni pauzadan chiqarmasa — u o'zi faollashadi.

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