"Bună, Amigo!"

"Bună, Rishi!"

„O să vă prezint metodele wait , notify și notifyAll ale clasei Object .”

„Astăzi doar ne vom familiariza cu ei, dar ne vom întoarce mai târziu și vom petrece mai mult timp cu asta”.

"Bine."

„Aceste metode au fost inventate ca parte a mecanismului de sincronizare a firelor”.

„Permiteți-mi să vă reamintesc că Java are un mecanism încorporat pentru controlul accesului la resursele partajate (obiecte) din fire diferite. Un thread poate declara că un obiect este ocupat, iar alte fire vor trebui să aștepte până când obiectul ocupat este eliberat. "

"Îmi amintesc. Faceți asta folosind cuvântul cheie sincronizat ."

„Corect. De obicei, codul ar arăta cam așa:”

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

— Îți amintești cum funcționează?

"Da. Dacă două fire de execuție apelează simultan metoda print(), unul dintre ele va intra în blocul etichetat sincronizat și va bloca monitorul, ceea ce face ca al doilea thread să aștepte până când monitorul este eliberat."

„Corect. Odată ce un fir de execuție intră în blocul etichetat sincronizat, obiectul monitor este marcat ca ocupat, iar alte fire de execuție vor fi forțate să aștepte ca obiectul monitor să fie eliberat. Același obiect monitor poate fi folosit în diferite părți ale programului. "

— Apropo, de ce ai ales monitorul de nume?

„Un monitor este ceea ce de obicei numiți un obiect care stochează starea ocupat sau liber.”

„Și aici intră în joc metodele de așteptare și notificare ”.

"De fapt, acestea sunt într-adevăr singurele două metode. Celelalte sunt doar adaptări ale acestor metode."

„Acum, haideți să înțelegem care este metoda de așteptare și de ce avem nevoie de ea.

„Uneori există situații într-un program în care un fir de execuție intră într-un bloc de cod sincronizat și blochează monitorul, dar nu poate continua deoarece îi lipsesc unele date. De exemplu, un fișier pe care trebuie să-l proceseze nu s-a terminat de descărcat sau ceva de genul."

"Am putea doar să așteptăm descărcarea fișierului. Puteți să-l verificați folosind o buclă. Dacă fișierul nu s-a descărcat încă, apoi dormiți o secundă și verificați din nou până când este descărcat."

"Ceva de genul:"

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

„Dar în cazul nostru, acest tip de așteptare este prea costisitor. Deoarece thread-ul nostru a blocat monitorul, și alte fire sunt forțate să aștepte, deși s-ar putea să aibă deja datele de care au nevoie.”

„ Metoda wait() a fost inventată pentru a rezolva această problemă. Această metodă face ca firul să elibereze monitorul și apoi „suspendă” firul.

„Puteți apela metoda de așteptare a unui obiect monitor numai atunci când monitorul este ocupat, adică numai în interiorul unui bloc sincronizat . Când se întâmplă acest lucru, firul de execuție se oprește temporar, iar monitorul este eliberat, astfel încât alte fire să-l poată folosi.”

„Există adesea cazuri în care un fir va intra într-un bloc sincronizat și va apela în așteptare, eliberând astfel monitorul.”

„Atunci va intra un al doilea fir și va fi suspendat, apoi un al treilea și așa mai departe”.

„Și cum se reia un thread?”

„Pentru asta, există o a doua metodă: notifica”.

„Puteți apela metodele notify / notifyAll ale unui obiect monitor numai atunci când monitorul este ocupat, adică numai în interiorul unui bloc sincronizat . Metoda notifyAll trezește toate firele care așteaptă pe acest obiect monitor.”

„ Metoda notify „deblochează” un fir aleatoriu, dar metoda notifyAll dezgheață toate firele „înghețate” ale acestui monitor.”

"Foarte interesant. Mulțumesc, Rishi."

„Există și adaptări ale metodei wait():”

metoda wait(). Explicaţie
void wait(long timeout)
Firul „îngheață”, dar se „deblochează” automat după așteptarea numărului de milisecunde transmis metodei ca argument.
void wait(long timeout, int nanos)
Firul „îngheață”, dar se „deblochează” automat după așteptarea numărului de nanosecunde transmis metodei ca argument.

„Numim asta și o așteptare cu un timeout. Metoda funcționează ca o așteptare normală, dar dacă timpul specificat a trecut și firul nu a fost trezit, se trezește singur.”