"Hei, Amigo!"

"Nå skal jeg fortelle deg litt om metodene for søvn, gi og bli med."

"Det er kjedelig. Jeg fant nettopp et intervjuspørsmål: 'Hva er forskjellen mellom metodene for yield (), søvn () og vente ()?'. Kan du forklare det?"

"Ikke noe problem. For det første er dette tre helt forskjellige metoder."

1) sleep(timeout)  – stopper den gjeldende tråden (som sleep ble kalt) for antall millisekunder angitt av timeout-parameteren. Tråden går deretter inn i tilstanden TIMED_WAITING. Metoden kan avsluttes tidligere hvis isInterrupted-flagget er satt.

Eksempel Beskrivelse
Thread.sleep(500);
Den gjeldende tråden suspenderer sin egen utførelse i 500 millisekunder, eller 0,5 sekunder.

2) yield()  – den gjeldende tråden 'hopper over sin tur'. Tråden går fra kjøretilstand til klartilstand , og JVM fortsetter til neste tråd. Kjøre- og klartilstandene er undertilstander til KJØRBAR- tilstanden.

Eksempel Beskrivelse
Thread.yield();
Den nåværende tråden "hopper over sin tur" og Java bytter umiddelbart til neste tråd.

3) wait(timeout)  – dette er en versjon av wait ()-metoden, men med en timeout. " Ventemetoden kan bare kalles innenfor en synkronisert blokk på et mutex-objekt som er låst av den gjeldende tråden. Ellers kaster metoden et Illegal MonitorState Exception.

"Å kalle denne metoden fører til at mutex-objektets lås frigjøres, noe som gjør den tilgjengelig for en annen tråd å hente. Dessuten går tråden inn i WAITING-tilstanden (for wait()-metoden uten parametere) eller TIMED_WAITING-tilstanden (for wait(timeout) ) metode)."

Eksempel Beskrivelse
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Når ventemetoden kalles, frigjør den gjeldende tråden monitorobjektets lås, og sover i 500 millisekunder. Monitorobjektet kan hentes av en annen tråd.
Etter 500 millisekunder vil tråden våkne og hvis monitoren ikke er opptatt, vil tråden hente den og fortsette å fungere.
Hvis monitoren er låst av en annen tråd, vil gjeldende tråd bytte til BLOKKERT tilstand.

4) bli med (tidsavbrudd)

"Denne metoden var ikke i spørsmålet ditt, men det er i timeplanen min, så jeg skal fortelle deg om det. Når du kaller join()- eller join(timeout)-metoden, blir den gjeldende tråden 'vedlagt' til tråden som kalte denne metoden. Den gjeldende tråden går i dvale og venter til tråden den er koblet til er ferdig (dvs. tråden hvis join()-metode ble kalt)."

"Den gjeldende tråden går inn i WAITING-tilstanden for join()-metoden og TIMED_WAITING-tilstanden for join(timeout)-metoden."

Eksempel Beskrivelse
Thread thread = getWorkThread();
thread.join(500);
Den gjeldende tråden vil bli med i workerThread-tråden og vente til den slutter.
Men den vil "avslutte" etter 500 millisekunder og fortsette å kjøre.

"Tidsavbruddet i metodene wait(timeout) og join(timeout) betyr at metoden går i dvale og venter på noe, men ikke lenger enn tidsavbruddet gitt i millisekunder. Så våkner den."

"Det virker som det eneste disse metodene har til felles er timeout. De gjør helt forskjellige ting."

"Ja, det stemmer."