"Ciao, Amico!"

"Ora ti parlerò un po' dei metodi sleep, yield e join."

"È noioso. Ho appena trovato una domanda dell'intervista: 'Qual è la differenza tra i metodi yield (), sleep () e wait ()?'. Puoi spiegarmelo?"

"Nessun problema. Prima di tutto, questi sono tre metodi completamente diversi."

1) sleep(timeout)  – interrompe il thread corrente (su cui è stato chiamato sleep) per il numero di millisecondi indicato dal parametro timeout. Il thread entra quindi nello stato TIMED_WAITING. Il metodo può terminare prima se è impostato il flag isInterrupted.

Esempio Descrizione
Thread.sleep(500);
Il thread corrente sospende la propria esecuzione per 500 millisecondi o 0,5 secondi.

2) yield()  – il thread corrente 'salta il suo turno'. Il thread passa dallo stato in esecuzione allo stato pronto e la JVM procede al thread successivo. Gli stati running e ready sono stati secondari dello stato RUNNABLE .

Esempio Descrizione
Thread.yield();
Il thread corrente "salta il suo turno" e Java passa immediatamente al thread successivo.

3) wait(timeout)  – questa è una versione del metodo wait (), ma con un timeout. "Il metodo wait può essere chiamato solo all'interno di un blocco sincronizzato su un oggetto mutex bloccato dal thread corrente. In caso contrario, il metodo genera un'eccezione Illegal MonitorState .

"La chiamata a questo metodo provoca il rilascio del blocco dell'oggetto mutex, rendendolo disponibile per l'acquisizione da parte di un altro thread. Inoltre, il thread entra nello stato WAITING (per il metodo wait() senza parametri) o nello stato TIMED_WAITING (per il metodo wait(timeout ) metodo)."

Esempio Descrizione
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Quando viene chiamato il metodo wait, il thread corrente rilascia il blocco dell'oggetto monitor e dorme per 500 millisecondi. L'oggetto monitor può essere acquisito da un altro thread.
Dopo 500 millisecondi, il thread si riattiverà e se il monitor non è occupato, il thread lo acquisirà e continuerà a funzionare.
Se il monitor è bloccato da un altro thread, il thread corrente passerà allo stato BLOCKED.

4) unisciti (timeout)

"Questo metodo non era nella tua domanda, ma è nel mio piano di lezione, quindi te ne parlerò. Quando chiami il metodo join() o join(timeout), il thread corrente viene 'allegato' al Thread che ha chiamato questo metodo. Il thread corrente va a dormire e attende fino a quando il thread a cui è stato unito termina (cioè il thread il cui metodo join() è stato chiamato)."

"Il thread corrente entra nello stato WAITING per il metodo join() e nello stato TIMED_WAITING per il metodo join(timeout)."

Esempio Descrizione
Thread thread = getWorkThread();
thread.join(500);
Il thread corrente si unirà al thread workerThread e attenderà che termini.
Ma si "separa" dopo 500 millisecondi e continua a funzionare.

"Il timeout nei metodi wait(timeout) e join(timeout) significa che il metodo va a dormire e attende qualcosa, ma non più del timeout dato in millisecondi. Poi si sveglia."

"Sembra che l'unica cosa che questi metodi hanno in comune sia il timeout. Fanno cose completamente diverse."

"Sì, è vero."