"Hej, Amigo!"

"Nu vil jeg fortælle dig lidt om metoderne til at sove, give efter og deltage."

"Det er kedeligt. Jeg har lige fundet et interviewspørgsmål: 'Hvad er forskellen mellem metoderne udbytte (), søvn () og vente ()?'. Kan du forklare det?"

"Intet problem. For det første er det tre helt forskellige metoder."

1) sleep(timeout)  – stopper den aktuelle tråd (hvorpå dvale blev kaldt) i det antal millisekunder, der er angivet af timeout-parameteren. Tråden går derefter i tilstanden TIMED_WAITING. Metoden kan slutte tidligere, hvis flaget isInterrupted er indstillet.

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

2) yield()  – den aktuelle tråd 'springer sin tur over'. Tråden går fra kørende tilstand til klar tilstand, og JVM fortsætter til næste tråd. De kørende og klar-tilstande er undertilstande af tilstanden RUNNABLE .

Eksempel Beskrivelse
Thread.yield();
Den nuværende tråd "springer sin tur over", og Java skifter straks til næste tråd.

3) wait(timeout)  – dette er en version af wait ()-metoden, men med en timeout. " Ventmetoden kan kun kaldes inden for en synkroniseret blok på et mutex-objekt, der er låst af den aktuelle tråd. Ellers kaster metoden en Illegal MonitorState Exception.

"At kalde denne metode bevirker, at mutex-objektets lås frigives, hvilket gør det tilgængeligt for en anden tråd at erhverve. Desuden går tråden ind i WAITING-tilstanden (for wait()-metoden uden parametre) eller TIMED_WAITING-tilstanden (for wait(timeout) ) metode)."

Eksempel Beskrivelse
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Når ventemetoden kaldes, frigiver den aktuelle tråd monitorobjektets lås og sover i 500 millisekunder. Monitorobjektet kan erhverves af en anden tråd.
Efter 500 millisekunder vil tråden vågne op, og hvis monitoren ikke er optaget, vil tråden hente den og fortsætte med at arbejde.
Hvis monitoren er låst af en anden tråd, skifter den aktuelle tråd til tilstanden BLOKERET.

4) join(timeout)

"Denne metode var ikke i dit spørgsmål, men den er i min lektionsplan, så jeg vil fortælle dig om det. Når du kalder join() eller join(timeout) metoden, er den aktuelle tråd 'vedhæftet' til tråden som kaldte denne metode. Den aktuelle tråd går i dvale og venter, indtil tråden, den er forbundet til, er færdig (dvs. den tråd, hvis join()-metode blev kaldt)."

"Den aktuelle tråd går ind i tilstanden WAITING for join()-metoden og TIMED_WAITING-tilstanden for join(timeout)-metoden."

Eksempel Beskrivelse
Thread thread = getWorkThread();
thread.join(500);
Den aktuelle tråd slutter sig til workerThread-tråden og venter på, at den slutter.
Men det vil 'afslutte' efter 500 millisekunder og fortsætte med at køre.

"Timeoutet i metoderne wait(timeout) og join(timeout) betyder, at metoden går i dvale og venter på noget, men ikke længere end timeouten angivet i millisekunder. Så vågner den."

"Det ser ud til, at det eneste, disse metoder har til fælles, er timeout. De gør helt forskellige ting."

"Ja, det er rigtigt."