2012-05-19 20 views
9

Ho letto che Thread.sleep() interromperà il thread attualmente in esecuzione per il tempo specificato dopo il quale ritorna allo stato di esecuzione in attesa del suo turno di esecuzione.chiama Thread.sleep() dal contesto sincronizzato in Java

Inoltre, se chiamato dal contesto synchronized, sleep() non rilascia il blocco in esso contenuto. Quindi mi stavo chiedendo quando rilascerà il lucchetto. Se il thread, messo in sleep, non ha mai la possibilità di essere eseguito in modo tale da mantenere sempre il lock con se stesso e quindi come gli altri thread possono entrare in metodi/blocchi sincronizzati.

Non sono sicuro di chiedere una domanda valida. Ma per favore aiutami.

risposta

16

Quindi mi chiedevo quando rilascerà il blocco.

Rilascerà il blocco all'uscita dal blocco synchronized e non prima.

Se il thread, messo in stato di sospensione, non ha mai la possibilità di essere eseguito in modo da mantenere sempre il blocco con se stesso e quindi come gli altri thread possono entrare in metodi/blocchi sincronizzati.

Semplicemente, altri thread non sarà in grado di immettere il codice che è sincronizzato sullo stesso oggetto che il filo sonno.

Per riassumere, chiamare Thread.sleep() da un blocco synchronized non è probabilmente una buona idea.

+2

In realtà, chiamare 'Thread.sleep()' probabilmente non è affatto una buona idea. Se c'è qualcosa che puoi fare ora, dovresti farlo adesso. Se devi aspettare qualcosa prima che ci sia qualcosa che puoi fare, devi aspettare quel qualcosa piuttosto che dormire. –

+2

@DavidSchwartz: sono d'accordo. Mentre ci sono usi legittimi per 'Thread.sleep()', è spesso usato dove non dovrebbe essere. – NPE

+0

Ben spiegato, ma dicendo "Per riassumere, chiamare Thread.sleep() da un blocco sincronizzato non è probabilmente una buona idea." sta andando troppo lontano A volte vuoi aspettare e mantenere il lucchetto. – Jesus

13

Se si utilizza Object.wait anziché Thread.sleep, verrà rilasciato il blocco dal blocco sincronizzato.