Thread.yield()

5 respostas
E

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?

5 Respostas

L

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.

E

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.

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

A

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

E

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

Vlw!!!

E

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

Criado 27 de agosto de 2010
Ultima resposta 27 de ago. de 2010
Respostas 5
Participantes 4