"Hei, Amigo!"

"Hei, Rishi!"

"Jeg skal introdusere deg til Object-klassens wait , notify og notifyAll -metoder."

— I dag skal vi bare bli kjent med dem, men vi kommer tilbake senere og bruker mer tid på dette.

"Greit."

"Disse metodene ble oppfunnet som en del av trådsynkroniseringsmekanismen."

"La meg minne deg på at Java har en innebygd mekanisme for å kontrollere tilgangen til delte ressurser (objekter) fra forskjellige tråder. En tråd kan erklære at et objekt er opptatt, og andre tråder må vente til det opptatte objektet slippes. "

"Jeg husker. Du gjør det ved å bruke det synkroniserte nøkkelordet."

"Riktig. Vanligvis vil koden se omtrent slik ut:"

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

"Husker du hvordan det fungerer?"

"Jepp. Hvis to tråder samtidig kaller print()-metoden, vil en av dem gå inn i blokken merket synkronisert og låse monitoren, noe som gjør det slik at den andre tråden vil vente til monitoren slippes."

"Riktig. Når en tråd kommer inn i blokken merket synkronisert, merkes overvåkingsobjektet som opptatt, og andre tråder vil bli tvunget til å vente på at overvåkingsobjektet blir frigitt. Det samme overvåkingsobjektet kan brukes i ulike deler av programmet. "

"Forresten, hvorfor valgte du navnemonitoren?"

"En skjerm er det du vanligvis kaller et objekt som lagrer opptatt eller ledig status."

"Og det er her vente- og varslingsmetodene spiller inn."

"Egentlig er dette de eneste to metodene. De andre er bare tilpasninger av disse metodene."

"Nå la oss vikle hodet rundt hva ventemetoden er og hvorfor vi trenger den. "

"Noen ganger er det situasjoner i et program der en tråd skriver inn en blokk med synkronisert kode og låser skjermen, men ikke kan fortsette fordi den mangler noen data. For eksempel er en fil den må behandle ikke er ferdig nedlastet eller noe sånt."

"Vi kan bare vente på at filen skal lastes ned. Du kan bare sjekke den ved hjelp av en løkke. Hvis filen ikke er lastet ned ennå, sov et sekund eller så, og sjekk igjen til den er lastet ned."

"Noe sånt som dette:"

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

"Men i vårt tilfelle er denne typen venting for dyr. Siden tråden vår låste skjermen, er andre tråder også tvunget til å vente selv om de kanskje allerede har dataene de trenger."

" Wait()- metoden ble oppfunnet for å løse dette problemet. Denne metoden fører til at tråden frigjør monitoren og deretter «suspenderer» tråden.

"Du kan kun kalle et monitorobjekts ventemetode når monitoren er opptatt, dvs. kun inne i en synkronisert blokk. Når dette skjer, stopper tråden midlertidig å kjøre, og monitoren frigjøres slik at andre tråder kan bruke den."

"Det er ofte tilfeller der en tråd vil gå inn i en synkronisert blokkering og anrop vente, og dermed frigjøre skjermen."

"Så vil en andre tråd gå inn og bli suspendert, deretter en tredje, og så videre."

"Og hvordan gjenopptas en tråd?"

"For det er det en annen metode: varsle."

"Du kan bare kalle opp et overvåkingsobjekts notify / notifyAll- metoder når monitoren er opptatt, dvs. kun inne i en synkronisert blokk. NotifyAll- metoden vekker alle tråder som venter på dette monitorobjektet."

" Varslingsmetoden 'opphever' én tilfeldig tråd, men notifyAll- metoden låser opp alle denne skjermens «frosne» tråder."

"Veldig interessant. Takk, Rishi."

"Det er også tilpasninger av wait()-metoden:"

wait() metode Forklaring
void wait(long timeout)
Tråden «fryser», men den «fryser opp» automatisk etter å ha ventet antall millisekunder som er sendt til metoden som argument.
void wait(long timeout, int nanos)
Tråden «fryser», men den «låser opp» automatisk etter å ha ventet på antall nanosekunder som er sendt til metoden som argument.

"Vi kaller dette også en venting med timeout. Metoden fungerer som en vanlig venting, men hvis den angitte tiden har gått og tråden ikke er vekket, vekker den seg selv."