Thread.yield()

Pessoal bom dia. O método yeild() faz com que um Thread com maior prioridade possa ser executado primeiro, até ai ok.

Minha pergunta é a seguinte, quando um thread, recebe um wait() de algum objeto, o thread fica adormecido esperando um notfy ou notfyAll, se for acionado um Thread.yield(), e esse thread adormecido que recebeu um wait() estiver com uma prioridade maior que todas, pode ser executado ou não? Ou so pode ser executado com um notfy mesmo?

Não.

Uma thread que está bloqueada com wait() só acorda quando outra thread der o notify() usando o mesmo objeto de lock. Ainda essim, a Thread que está esperando só volta a executar quando recuperar de novo o lock que havia sido liberado pelo wait().

Outra, o seu conceito de yield() é impreciso. Este método é só uma indicação para que a thread corrente pare de executar e dê uma oportunidade pra outras executarem. Não vai dar pra saber qual vai ser a decisão do scheduler de threads. Havendo uma thread de maior prioridade, é possível que esta seja executado; mas se bobear, pode a própria thread que deu yield() ser a escolhida.

[quote=Leonardo3001]Não.

Uma thread que está bloqueada com wait() só acorda quando outra thread der o notify() usando o mesmo objeto de lock. Ainda essim, a Thread que está esperando só volta a executar quando recuperar de novo o lock que havia sido liberado pelo wait().

Outra, o seu conceito de yield() é impreciso. Este método é só uma indicação para que a thread corrente pare de executar e dê uma oportunidade pra outras executarem. Não vai dar pra saber qual vai ser a decisão do scheduler de threads. Havendo uma thread de maior prioridade, é possível que esta seja executado; mas se bobear, pode a própria thread que deu yield() ser a escolhida.[/quote]

E se o scheduler escolher outra pra ser executa, a mesma que estava sendo executada para?

Se o método que a thread executar for wait() (assim, sem parâmetros), então só um notify() (ou notifyAll) ou Thread.interrupt() podem cancelar a espera (neste último caso, a Thread vai lançar uma InterruptedException).

Então, respondendo sua pergunta… yield() não vai fazer a Thread sair do estado de espera. E, a propósito, este método não cai na prova, OK ?

[]´s

[quote=asaudate]Se o método que a thread executar for wait() (assim, sem parâmetros), então só um notify() (ou notifyAll) ou Thread.interrupt() podem cancelar a espera (neste último caso, a Thread vai lançar uma InterruptedException).

Então, respondendo sua pergunta… yield() não vai fazer a Thread sair do estado de espera. E, a propósito, este método não cai na prova, OK ?

[]´s[/quote]

Vlw!!!

Thread.yield é mais ou menos equivalente a Thread.sleep (0), exceto pelo fato que Thread.yield ordinariamente não pode ser interrompida por uma InterruptedException. É um método que basicamente só existe porque o Java poderia ser executado em sistemas operacionais que não têm threads de verdade, e precisam do modelo cooperativo para funcionarem com várias linhas de execução. (Na prática, isso é um método obsoleto).