"Hej, Amigo!"

"Hej, Rishi!"

"Jeg vil introducere dig til Object-klassens wait , notify og notifyAll metoder."

"I dag skal vi lige stifte bekendtskab med dem, men vi vender tilbage senere og bruger mere tid på det her."

"Okay."

"Disse metoder blev opfundet som en del af trådsynkroniseringsmekanismen."

"Lad mig minde dig om, at Java har en indbygget mekanisme til at kontrollere adgangen til delte ressourcer (objekter) fra forskellige tråde. En tråd kan erklære, at et objekt er optaget, og andre tråde bliver nødt til at vente, indtil det travle objekt er frigivet. "

"Jeg kan huske. Det gør du ved at bruge det synkroniserede søgeord."

"Godt. Typisk vil koden se sådan ud:"

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

"Husker du, hvordan det virker?"

"Jep. Hvis to tråde samtidig kalder print()-metoden, vil en af ​​dem gå ind i blokken mærket synkroniseret og låse monitoren, hvilket gør det så den anden tråd vil vente, indtil monitoren frigives."

"Right. Når en tråd kommer ind i blokken mærket synkroniseret, markeres monitorobjektet som optaget, og andre tråde vil blive tvunget til at vente på at monitorobjektet frigives. Det samme monitorobjekt kan bruges i forskellige dele af programmet. "

"Hvorfor valgte du i øvrigt navnemonitoren?"

"En skærm er, hvad du normalt kalder et objekt, der gemmer optaget eller ledig status."

"Og det er her, at vente- og underretningsmetoderne kommer i spil."

"Det er faktisk de eneste to metoder. De andre er bare tilpasninger af disse metoder."

"Lad os nu vikle vores hoveder omkring, hvad ventemetoden er, og hvorfor vi har brug for den. "

"Nogle gange er der situationer i et program, hvor en tråd indtaster en blok med synkroniseret kode og låser skærmen, men ikke kan fortsætte, fordi den mangler nogle data. For eksempel er en fil, den skal behandle, ikke færdig med at downloade eller noget i den stil."

"Vi kunne bare vente på, at filen blev downloadet. Du kan bare tjekke den ved hjælp af en loop. Hvis filen ikke er downloadet endnu, så sov et sekund eller deromkring, og tjek igen, indtil den er downloadet."

"Noget i stil med dette:"

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

"Men i vores tilfælde er denne type ventetid for dyr. Da vores tråd låste skærmen, er andre tråde også tvunget til at vente, selvom de måske allerede har de data, de har brug for."

" Wait()- metoden blev opfundet for at løse dette problem. Denne metode får tråden til at frigive monitoren og derefter «suspendere» tråden.

"Du kan kun kalde et monitorobjekts ventemetode, når monitoren er optaget, dvs. kun inde i en synkroniseret blok. Når dette sker, stopper tråden midlertidigt med at køre, og monitoren frigives, så andre tråde kan bruge den."

"Der er ofte tilfælde, hvor en tråd vil gå ind i en synkroniseret blok og vente på opkald og dermed frigive skærmen."

"Så vil en anden tråd komme ind og blive suspenderet, så en tredje, og så videre."

"Og hvordan genoptages en tråd?"

"Til det er der en anden metode: underrette."

"Du kan kun kalde et monitorobjekts notify / notifyAll metoder, når monitoren er optaget, dvs. kun inde i en synkroniseret blok. NotifyAll metoden vækker alle tråde, der venter på dette monitorobjekt."

" Meddelelsesmetoden 'ophæver' en tilfældig tråd, men notifyAll- metoden ophæver alle denne skærms "frosne" tråde."

"Meget interessant. Tak, Rishi."

"Der er også tilpasninger af wait()-metoden:"

wait() metode Forklaring
void wait(long timeout)
Tråden «fryser», men den «låser automatisk op» efter at have ventet det antal millisekunder, der er gået til metoden som argument.
void wait(long timeout, int nanos)
Tråden «fryser», men den «låser automatisk op» efter at have ventet på antallet af nanosekunder, der er overført til metoden som argument.

"Vi kalder dette også en ventetid med timeout. Metoden fungerer som en normal ventetid, men hvis den angivne tid er gået, og tråden ikke er blevet vækket, vækker den sig selv."