JavaRush /Blogue Java /Random-PT /Nível 25. Respostas às perguntas da entrevista sobre o tó...
zor07
Nível 31
Санкт-Петербург

Nível 25. Respostas às perguntas da entrevista sobre o tópico do nível

Publicado no grupo Random-PT
Nível 25. Respostas às perguntas da entrevista sobre o tema do nível - 1
  1. Quais são todos os estados do objeto Thread?

    • NOVO
    • EXECUTÁVEL
    • BLOQUEADO
    • ESPERANDO
    • TIMED_WAITING
    • TERMINADO
  2. 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 synchronizednão estiver ocupado por outro thread. Caso contrário, nossa thread receberá o estado BLOCKED e aguardará a liberação do objeto mutex.

  3. Para qual estado o thread irá ao chamar o método wait()?

    Chamar esse método coloca o thread no estado WAITING.
    O método wait()só pode ser chamado dentro de um bloco synchronizedem 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 é chamado wait(), o thread atual libera o bloqueio do objeto monitore entra no estado WAITING, aguardando que o método seja chamado monitor.notify()por monitor.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.

  4. Para qual estado o thread irá ao chamar o método wait(500)?

    Chamar esse método coloca o thread no estado TIMED_WAITING.
    Por analogia com o método wait(), wait(timeout)ele só pode ser chamado dentro de um bloco synchronizedem 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 objeto monitore entra em suspensão por 500 milissegundos. O objeto monitorpode ser capturado por outro thread.
    Após 500 milissegundos, o thread será ativado e, se monitornã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();}

    Depois monitor.wait(), o thread entrará no estado WAITING. Um método notify()chamado por outro thread em um objeto monitormoverá 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.

  5. 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.

  6. Três threads no bloco sincronizado são chamados wait()de objeto mutex. Para qual estado esses threads irão se o quarto thread chamar notifyAll()?

    Dois deles irão para o estado BLOCKED, um para o estado RUNNABLE

  7. Como é diferente join(500)de wait(500)?

    Apesar de e join(500)transferir wait(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étodo join()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.

  8. Como é diferente wait(500)de sleep(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.

  9. Para qual estado o thread irá ao chamar o método yield()?

    Quando um método é chamado yield(), o thread atual “pula sua vez” e o java imediatamente muda para a execução do próximo thread. O segmento vai de estado runningpara estado ready. Os estados running & ready são subestados do estado RUNNABLE.

PS Comentários, acréscimos, correções e observações são bem-vindos =)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION