"Hallo Amigo!"

"Nu zal ik je iets vertellen over de slaap-, opbrengst- en verbindingsmethoden."

"Dat is saai. Ik heb net een interviewvraag gevonden: 'Wat is het verschil tussen de methoden yield (), sleep () en wait ()?'. Kun je dat uitleggen?"

"Geen probleem. Ten eerste zijn dit drie totaal verschillende methoden."

1) slaap(time-out)  – stopt de huidige thread (waarop slaap werd aangeroepen) gedurende het aantal milliseconden dat wordt aangegeven door de time-outparameter. De thread gaat dan in de TIMED_WAITING-status. De methode kan eerder eindigen als de vlag isInterrupted is ingesteld.

Voorbeeld Beschrijving
Thread.sleep(500);
De huidige thread onderbreekt zijn eigen uitvoering gedurende 500 milliseconden of 0,5 seconden.

2) yield()  – de huidige thread 'slaat zijn beurt over'. De thread gaat van de running-status naar de ready- status en de JVM gaat verder naar de volgende thread. De status Running en Ready zijn substatussen van de status RUNNABLE .

Voorbeeld Beschrijving
Thread.yield();
De huidige thread "slaat zijn beurt over" en Java schakelt onmiddellijk over naar de volgende thread.

3) wait(timeout)  – dit is een versie van de wait () methode, maar met een timeout. "De wait- methode kan alleen worden aangeroepen binnen een gesynchroniseerd blok op een mutex-object dat is vergrendeld door de huidige thread. Anders genereert de methode een Illegal MonitorState Exception.

"Het aanroepen van deze methode zorgt ervoor dat de vergrendeling van het mutex-object wordt vrijgegeven, waardoor het beschikbaar wordt voor een andere thread om te verwerven. Bovendien gaat de thread de WAITING-status binnen (voor de wait()-methode zonder parameters) of de TIMED_WAITING-status (voor de wait(timeout ) methode)."

Voorbeeld Beschrijving
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Wanneer de wait-methode wordt aangeroepen, geeft de huidige thread de vergrendeling van het monitorobject vrij en slaapt hij gedurende 500 milliseconden. Het monitorobject kan worden verkregen door een andere thread.
Na 500 milliseconden wordt de thread wakker en als de monitor niet bezet is, zal de thread deze ophalen en blijven werken.
Als de monitor is vergrendeld door een andere thread, schakelt de huidige thread over naar de status GEBLOKKEERD.

4) meedoen(time-out)

"Deze methode stond niet in je vraag, maar staat in mijn lesplan, dus ik zal je erover vertellen. Wanneer je de methode join() of join(timeout) aanroept, wordt de huidige thread 'gehecht' aan de thread die deze methode heeft aangeroepen. De huidige thread gaat in de slaapstand en wacht tot de thread waaraan deze is gekoppeld, is voltooid (dwz de thread waarvan de join()-methode is aangeroepen)."

"De huidige thread krijgt de status WAITING voor de methode join() en de status TIMED_WAITING voor de methode join(timeout)."

Voorbeeld Beschrijving
Thread thread = getWorkThread();
thread.join(500);
De huidige thread voegt zich bij de workerThread-thread en wacht tot deze is beëindigd.
Maar het zal na 500 milliseconden 'ontkoppelen' en blijven draaien.

"De time-out in de methode wait(timeout) en join(timeout) betekent dat de methode in slaapstand gaat en op iets wacht, maar niet langer dan de time-out die in milliseconden wordt gegeven. Daarna wordt hij wakker."

"Het lijkt erop dat time-out het enige is dat deze methoden gemeen hebben. Ze doen totaal verschillende dingen."

"Ja, dat klopt."