-
Quali sono tutti gli stati dell'oggetto
Thread
?- NUOVO
- CORRIBILE
- BLOCCATO
- IN ATTESA
- TIMED_WAITING
- TERMINATO
-
A quali stati può andare un thread quando entra in un blocco
synchronized
?- CORRIBILE
- BLOCCATO
In RUNNABLE, se il blocco di codice contrassegnato
synchronized
non è occupato da un altro thread. Altrimenti il nostro thread riceverà lo stato BLOCKED e attenderà il rilascio dell'oggetto mutex. - In quale stato passerà il thread quando chiamerà il metodo
wait()
?La chiamata a questo metodo pone il thread nello stato WAITING.
Il metodowait()
può essere chiamato solo all'interno di un bloccosynchronized
su un oggetto mutex che è stato "bloccato" dal thread corrente, altrimenti il metodo lancerà un'eccezione IllegalMonitorStateException .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Quando viene chiamato un metodowait()
, il thread corrente rilascia il blocco dall'oggettomonitor
ed entra nello stato WAITING, in attesa che il metodo venga chiamatomonitor.notify()
damonitor.notifyAll()
un altro thread. Non appena ciò accade, il thread si riattiverà e se il monitor non era occupato, lo prenderà e continuerà a funzionare.
Se il monitor è occupato da un altro thread, il thread corrente passerà allo stato BLOCCATO. -
In quale stato passerà il thread quando chiamerà il metodo
La chiamata a questo metodo pone il thread nello stato TIMED_WAITING.wait(500)
?
Per analogia con il metodowait()
,wait(timeout)
può essere chiamato solo all'interno di un bloccosynchronized
su un oggetto mutex che è stato “bloccato (bloccato)” dal thread corrente.Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Quando si chiama il metodo
wait()
, il thread corrente rilascia il blocco dall'oggettomonitor
e va in sospensione per 500 millisecondi. L'oggettomonitor
potrebbe essere catturato da un altro thread.
Dopo 500 millisecondi, il thread si riattiverà e, semonitor
non era occupato, lo prenderà e continuerà a lavorare.
Se il monitor è occupato da un altro thread, il thread corrente passerà allo stato BLOCCATO.In quale stato passerà il thread quando chiamerà il metodo
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Dopomonitor.wait()
, il thread entrerà nello stato WAITING. Un metodonotify()
chiamato da un altro thread su un oggettomonitor
sposterà il thread dallo stato WAITING allo stato RUNNABLE a meno che l'oggetto monitor non venga catturato da un altro thread, altrimenti allo stato BLOCKED. -
In quale stato passerà il thread quando chiamerà il metodo
notifyAll()
?notifyAll()
"rimarranno" tutti i thread. Uno di tutti i thread "dormienti" (WAITING) entrerà nello stato RUNNABLE, assumerà il controllo del monitor dell'oggetto utilizzato e continuerà il suo lavoro. Il resto sarà nello stato BLOCCATO. Non appena il primo thread di "risveglio" rilascia il monitor, cosa che tutti gli altri stanno aspettando, il suo destino verrà ripetuto dal thread successivo (un thread arbitrario passerà dallo stato BLOCCATO allo stato RUNNABLE). Ciò continuerà finché tutti i thread "risvegliati" non lasceranno lo stato BLOCCATO. -
Tre thread nel blocco sincronizzato chiamati
Due di essi passeranno allo stato BLOCCATO, uno allo stato RUNNABLEwait()
oggetto mutex. A quale stato andranno questi thread se il quarto thread chiamanotifyAll()
? -
In cosa è diverso
Nonostante il fatto che ejoin(500)
dawait(500)
?join(500)
trasferiràwait(500)
il thread corrente allo stato TIMED_WAITING, ci sono differenze significative tra loro:join(500)
chiamato su un thread,wait(500)
chiamato all'interno di un blocco sincronizzato sull'oggetto su cui questo blocco è sincronizzato.
Quando viene chiamato,join(500)
il thread corrente attenderà 500 millisecondi per iljoin()
completamento del thread il cui metodo è stato chiamato.
Quando viene chiamato,wait(500)
il thread corrente rilascerà il blocco dall'oggetto sincronizzato e andrà in modalità di sospensione per 500 millisecondi.
Dopo 500 millisecondi in entrambi i casi i thread continueranno a funzionare. -
In cosa è diverso
wait(500)
dasleep(500)
?sleep(500)
chiamato su un thread,wait(500)
chiamato all'interno di un blocco sincronizzato sull'oggetto su cui questo blocco è sincronizzato.
Quando viene chiamato,sleep(500)
il thread corrente attenderà 500 millisecondi, quindi continuerà il suo lavoro.
Quando viene chiamato,wait(500)
il thread corrente rilascerà il blocco dall'oggetto sincronizzato e andrà in modalità di sospensione per 500 millisecondi. -
In quale stato passerà il thread quando chiamerà il metodo
Quando viene chiamato un metodoyield()
?yield()
, il thread corrente “salta il suo turno” e Java passa immediatamente all'esecuzione del thread successivo. Il filo va da statorunning
a statoready
. Gli stati in esecuzione e pronto sono sottostati dello stato RUNNABLE.
GO TO FULL VERSION