-
Quais são todos os estados do objeto
Thread
?- NOVO
- EXECUTÁVEL
- BLOQUEADO
- ESPERANDO
- TIMED_WAITING
- TERMINADO
-
Para quais estados um thread pode ir ao entrar em um bloco
synchronized
?- EXECUTÁVEL
- BLOQUEADO
Em RUNNABLE, se o bloco de código marcado
synchronized
não estiver ocupado por outro thread. Caso contrário, nossa thread receberá o estado BLOCKED e aguardará a liberação do objeto mutex. - Para qual estado o thread irá ao chamar o método
wait()
?Chamar esse método coloca o thread no estado WAITING.
O métodowait()
só pode ser chamado dentro de um blocosynchronized
em um objeto mutex que foi “bloqueado” pelo thread atual, caso contrário o método lançará uma exceção IllegalMonitorStateException .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Quando um método é chamadowait()
, o thread atual libera o bloqueio do objetomonitor
e entra no estado WAITING, aguardando que o método seja chamadomonitor.notify()
pormonitor.notifyAll()
outro thread. Assim que isso acontecer, o thread irá acordar e se o monitor não estiver ocupado, ele irá agarrá-lo e continuar trabalhando.
Se o monitor estiver ocupado por outro thread, o thread atual entrará no estado BLOQUEADO. -
Para qual estado o thread irá ao chamar o método
Chamar esse método coloca o thread no estado TIMED_WAITING.wait(500)
?
Por analogia com o métodowait()
,wait(timeout)
ele só pode ser chamado dentro de um blocosynchronized
em um objeto mutex que foi “bloqueado (bloqueado)” pelo thread atual.Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Ao chamar o método
wait()
, o thread atual libera o bloqueio do objetomonitor
e entra em suspensão por 500 milissegundos. O objetomonitor
pode ser capturado por outro thread.
Após 500 milissegundos, o thread será ativado e, semonitor
não estiver ocupado, irá agarrá-lo e continuar trabalhando.
Se o monitor estiver ocupado por outro thread, o thread atual entrará no estado BLOQUEADO.Para qual estado o thread irá ao chamar o método
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Depoismonitor.wait()
, o thread entrará no estado WAITING. Um métodonotify()
chamado por outro thread em um objetomonitor
moverá o thread do estado WAITING para o estado RUNNABLE, a menos que o objeto monitor seja capturado por outro thread, caso contrário, para o estado BLOCKED. -
Para qual estado o thread irá ao chamar o método
notifyAll()
?notifyAll()
"vai ficar" todos os tópicos. Um de todos os threads "adormecidos" (WAITING) entrará no estado RUNNABLE, assumirá o controle do objeto em uso e continuará seu trabalho. O restante estará no estado BLOQUEADO. Assim que o primeiro thread “acordado” liberar o monitor, que todos os outros estão esperando, seu destino será repetido pelo próximo thread (um thread arbitrário passará do estado BLOCKED para o estado RUNNABLE). Isso continuará até que todos os threads "despertados" deixem o estado BLOQUEADO. -
Três threads no bloco sincronizado são chamados
Dois deles irão para o estado BLOCKED, um para o estado RUNNABLEwait()
de objeto mutex. Para qual estado esses threads irão se o quarto thread chamarnotifyAll()
? -
Como é diferente
Apesar de ejoin(500)
dewait(500)
?join(500)
transferirwait(500)
o thread atual para o estado TIMED_WAITING, existem diferenças significativas entre eles:join(500)
chamado em um thread,wait(500)
chamado dentro de um bloco sincronizado no objeto no qual este bloco está sincronizado.
Quando chamado,join(500)
o thread atual aguardará 500 milissegundos para que o thread cujo métodojoin()
foi chamado seja concluído.
Quando chamado,wait(500)
o thread atual liberará o bloqueio do objeto sincronizado e entrará em suspensão por 500 milissegundos.
Após 500 milissegundos, em ambos os casos os threads continuarão funcionando. -
Como é diferente
wait(500)
desleep(500)
?sleep(500)
chamado em um thread,wait(500)
chamado dentro de um bloco sincronizado no objeto no qual esse bloco está sincronizado.
Quando chamado,sleep(500)
o thread atual aguardará 500 milissegundos e continuará seu trabalho.
Quando chamado,wait(500)
o thread atual liberará o bloqueio do objeto sincronizado e entrará em suspensão por 500 milissegundos. -
Para qual estado o thread irá ao chamar o método
Quando um método é chamadoyield()
?yield()
, o thread atual “pula sua vez” e o java imediatamente muda para a execução do próximo thread. O segmento vai de estadorunning
para estadoready
. Os estados running & ready são subestados do estado RUNNABLE.
GO TO FULL VERSION