"Hej, Amigo!"

"Hej Rishi!"

"Jag kommer att presentera dig för Object-klassens metoder för wait , notify och notifyAll ."

"I dag ska vi bara bekanta oss med dem, men vi kommer tillbaka senare och lägger mer tid på det här."

"Okej."

"Dessa metoder uppfanns som en del av trådsynkroniseringsmekanismen."

"Låt mig påminna dig om att Java har en inbyggd mekanism för att kontrollera åtkomst till delade resurser (objekt) från olika trådar. En tråd kan förklara att ett objekt är upptaget, och andra trådar kommer att behöva vänta tills det upptagna objektet släpps. "

"Jag kommer ihåg. Du gör det med det synkroniserade nyckelordet."

"Rätt. Typiskt skulle koden se ut ungefär så här:"

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

"Kommer du ihåg hur det fungerar?"

"Japp. Om två trådar samtidigt anropar metoden print() kommer en av dem att gå in i blocket märkt synkroniserat och låsa monitorn, vilket gör att den andra tråden väntar tills monitorn släpps."

"Höger. När en tråd kommer in i blocket märkt synkroniserat, markeras monitorobjektet som upptaget, och andra trådar kommer att tvingas vänta på att monitorobjektet ska släppas. Samma monitorobjekt kan användas i olika delar av programmet. "

"Förresten, varför valde du namnmonitorn?"

"En monitor är vad man brukar kalla ett objekt som lagrar statusen upptagen eller ledig."

"Och det är här som vänte- och meddelandemetoderna kommer in i bilden."

"Det här är faktiskt de enda två metoderna. De andra är bara anpassningar av dessa metoder."

"Låt oss nu slå in våra huvuden kring vad väntemetoden är och varför vi behöver den. "

"Ibland finns det situationer i ett program där en tråd skriver in ett block med synkroniserad kod och låser monitorn, men inte kan fortsätta eftersom det saknas data. Till exempel har en fil som den behöver bearbeta inte laddats ned eller något sådant."

"Vi kan bara vänta på att filen ska laddas ner. Du kan bara kontrollera den med en loop. Om filen inte har laddats ner ännu, sova en sekund eller så och kontrollera igen tills den har laddats ner."

"Något som det här:"

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

"Men i vårt fall är den här typen av väntan för dyr. Eftersom vår tråd låste monitorn tvingas även andra trådar vänta även om de kanske redan har den data de behöver."

" Wait() -metoden uppfanns för att lösa detta problem. Den här metoden gör att tråden släpper monitorn och sedan «avbryter» tråden.

"Du kan bara anropa ett monitorobjekts väntemetod när monitorn är upptagen, dvs bara inuti ett synkroniserat block. När detta händer slutar tråden tillfälligt att köras, och monitorn släpps så att andra trådar kan använda den."

"Det finns ofta tillfällen där en tråd kommer in i ett synkroniserat block och samtal vänta, vilket släpper monitorn."

"Då kommer en andra tråd in och avbryts, sedan en tredje och så vidare."

"Och hur återupptas en tråd?"

"För det finns det en andra metod: meddela."

"Du kan bara anropa ett monitorobjekts notify / notifyAll -metoder när monitorn är upptagen, dvs bara i ett synkroniserat block. NotifyAll- metoden väcker alla trådar som väntar på detta monitorobjekt."

" Meddelandemetoden "upplöser" en slumpmässig tråd, men notifyAll -metoden låser upp alla denna monitors "frysta" trådar."

"Mycket intressant. Tack, Rishi."

"Det finns också anpassningar av wait()-metoden:"

wait() metod Förklaring
void wait(long timeout)
Tråden «fryser», men den «upplöses» automatiskt efter att ha väntat på antalet millisekunder som skickats till metoden som argument.
void wait(long timeout, int nanos)
Tråden «fryser», men den «upplöses» automatiskt efter att ha väntat på antalet nanosekunder som skickas till metoden som argument.

"Vi kallar detta också för en väntan med timeout. Metoden fungerar som en vanlig väntan, men om den angivna tiden har gått och tråden inte har väckts, så vaknar den av sig själv."