"Olá, amigo!"

"Agora vou falar um pouco sobre os métodos sleep, yield e join."

"Isso é chato. Acabei de encontrar uma pergunta de entrevista: 'Qual é a diferença entre os métodos yield (), sleep () e wait ()?'. Você pode explicar isso?"

"Sem problema. Em primeiro lugar, esses são três métodos completamente diferentes."

1) sleep(timeout)  – interrompe o thread atual (no qual o sleep foi chamado) pelo número de milissegundos indicado pelo parâmetro timeout. O thread então entra no estado TIMED_WAITING. O método pode terminar antes se o sinalizador isInterrupted estiver definido.

Exemplo Descrição
Thread.sleep(500);
O thread atual suspende sua própria execução por 500 milissegundos ou 0,5 segundos.

2) yield()  – o thread atual 'pula sua vez'. O encadeamento vai do estado em execução para o estado pronto e a JVM prossegue para o próximo encadeamento. Os estados em execução e pronto são subestados do estado RUNNABLE .

Exemplo Descrição
Thread.yield();
O thread atual "pula sua vez" e o Java muda imediatamente para o próximo thread.

3) wait(timeout)  – é uma versão do método wait (), mas com timeout. "O método wait só pode ser chamado dentro de um bloco sincronizado em um objeto mutex bloqueado pelo thread atual. Caso contrário, o método lançará uma exceção Illegal MonitorState .

"Chamar este método faz com que o bloqueio do objeto mutex seja liberado, tornando-o disponível para outro thread adquirir. Além disso, o thread entra no estado WAITING (para o método wait() sem parâmetros) ou no estado TIMED_WAITING (para o wait(timeout ) método)."

Exemplo Descrição
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Quando o método wait é chamado, o thread atual libera o bloqueio do objeto monitor e fica suspenso por 500 milissegundos. O objeto monitor pode ser adquirido por outro thread.
Após 500 milissegundos, o thread será ativado e, se o monitor não estiver ocupado, o thread o adquirirá e continuará funcionando.
Se o monitor estiver bloqueado por outro thread, o thread atual mudará para o estado BLOCKED.

4) join (tempo limite)

"Este método não estava na sua pergunta, mas está no meu plano de aula, então vou falar sobre isso. Quando você chama o método join() ou join(timeout), o thread atual é 'anexado' ao Thread que chamou este método. O thread atual vai dormir e espera até que o thread ao qual ele se juntou seja concluído (ou seja, o thread cujo método join() foi chamado)."

"O thread atual entra no estado WAITING para o método join() e no estado TIMED_WAITING para o método join(timeout)."

Exemplo Descrição
Thread thread = getWorkThread();
thread.join(500);
O thread atual se juntará ao thread workerThread e esperará que ele termine.
Mas ele será 'desassociado' após 500 milissegundos e continuará em execução.

"O tempo limite nos métodos wait(timeout) e join(timeout) significa que o método vai dormir e espera por algo, mas não mais do que o tempo limite dado em milissegundos. Então ele acorda."

"Parece que a única coisa que esses métodos têm em comum é o tempo limite. Eles fazem coisas completamente diferentes."

"Sim, isso mesmo."