"Hej, Amigo!"

"Nu ska jag berätta lite om metoderna för sömn, ge sig och gå med."

"Det är tråkigt. Jag hittade precis en intervjufråga: 'Vad är skillnaden mellan metoderna för avkastning (), sömn () och vänta ()?'. Kan du förklara det?"

"Inga problem. För det första är det här tre helt olika metoder."

1) sleep(timeout)  – stoppar den aktuella tråden (som sleep anropades) under det antal millisekunder som anges av timeout-parametern. Tråden går sedan in i tillståndet TIMED_WAITING. Metoden kan avslutas tidigare om flaggan isInterrupted är inställd.

Exempel Beskrivning
Thread.sleep(500);
Den aktuella tråden avbryter sin egen körning i 500 millisekunder, eller 0,5 sekunder.

2) yield()  – den aktuella tråden "hoppar över sin tur". Tråden går från körtillståndet till redoläget , och JVM fortsätter till nästa tråd. Kör- och redo-tillstånden är undertillstånd av KÖR- BAR -tillståndet.

Exempel Beskrivning
Thread.yield();
Den aktuella tråden "hoppar över sin tur" och Java byter omedelbart till nästa tråd.

3) wait(timeout)  – detta är en version av wait ()-metoden, men med en timeout. " Väntemetoden kan endast anropas inom ett synkroniserat block på ett mutex-objekt som är låst av den aktuella tråden. Annars ger metoden ett Illegal MonitorState Exception.

"Att anropa denna metod gör att mutex-objektets lås släpps, vilket gör det tillgängligt för en annan tråd att förvärva. Dessutom går tråden in i WAITING-tillståndet (för metoden wait() utan parametrar) eller TIMED_WAITING-tillståndet (för wait(timeout) ) metod)."

Exempel Beskrivning
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
När väntemetoden anropas släpper den aktuella tråden monitorobjektets lås och sover i 500 millisekunder. Monitorobjektet kan förvärvas av en annan tråd.
Efter 500 millisekunder kommer tråden att vakna och om monitorn inte är upptagen kommer tråden att hämta den och fortsätta att fungera.
Om monitorn är låst av en annan tråd kommer den aktuella tråden att växla till BLOCKERAD.

4) gå med (timeout)

"Den här metoden fanns inte i din fråga, men den finns i min lektionsplan, så jag ska berätta om det. När du anropar metoden join() eller join(timeout), är den aktuella tråden 'bifogad' till tråden som kallade den här metoden. Den aktuella tråden går i viloläge och väntar tills tråden den är ansluten till avslutas (dvs den tråd vars join()-metod anropades)."

"Den aktuella tråden går in i WAITING-tillståndet för join()-metoden och TIMED_WAITING-tillståndet för join(timeout)-metoden."

Exempel Beskrivning
Thread thread = getWorkThread();
thread.join(500);
Den aktuella tråden kommer att gå med i workerThread-tråden och vänta tills den tar slut.
Men det kommer att "avsluta" efter 500 millisekunder och fortsätta att köra.

"Timeouten i metoderna wait(timeout) och join(timeout) innebär att metoden går i viloläge och väntar på något, men inte längre än timeouten som ges i millisekunder. Sedan vaknar den."

"Det verkar som att det enda de här metoderna har gemensamt är timeout. De gör helt olika saker."

"Japp, det stämmer."