Método yield da classe Thread

Alguém pode me explicar exatamente como o método “yield” da classe Thread funciona? Na documentação, a única coisa que está escrito é:

[b]yield

public static void yield()

Causes the currently executing thread object to temporarily pause and allow other threads to execute. [/b]

o que não ajuda muito…

o método yield faz com que a thread atual pare de executar e permite que outras threads com a msm prioridade sejam executadas…

Bom, vou te ajudar, mas antes vou te dar uma dica. A área da computação envolve estudo. Vejo você abrindo tópicos todo dia. Nada contra isso,mas as suas dúvidas são respondidas por livros como o da certificação, basta pegar em uma biblioteca ou comprar e sair lendo. Caso ocorram dúvidas quanto ao conteúdo do livro, aí sim é legal vir perguntar. Digo isso porque você vai acabar viciando em respostas prontas e no fim das contas não saberá se virar sozinho, o que para se manter num emprego é algo muito perigoso.

Mas vamos a sua dúvida:

Para garantir que as Threads sejam executadas de tempos em tempos, o sistema operacional realiza algo chamado Preempção. Basicamente o SO executa uma thread durante x milisegundos e alterna para a próxima Thread. Existem algumas regras quanto a isso, como fila de prioridades, mas não vamos entrar em detalhes.

O que é o yield faz é antecipar-se ao SO e suspender a Thread atual. Dessa forma você tem certeza que uma outra Thread que estava esperando entrará em execução. Qual você não sabe, mas sabe que a atual ficará suspensa por um tempo, dando lugar a uma outra.

Somente uma observação, não há garantias que ao chamar o método yield() a thread atual será suspensa, pode até acontecer da thread atual ser suspensa e imediatamente retornar ao estado de execução. O que acontece é que você dá uma dica ao scheduer que podem haver threads esperando. (parágrafo quase que chupado do livro da Katy Sierra)

Certo, mas e se as Threads que estiverem no pool Executável tiverem prioridades diferentes?

Ainda assim a Thread em execução poderá parar de executar após chamar yield, caso o agendador assim decida?

Outra dúvida…

Na situação de todas as prioridades serem iguais:

Quando chama yield a thread vai direto para o pool executável?

Isso ainda tá um pouco confuso.

Grato.

O yield() não pausa nada.

Ele é só uma mensagem que a thread manda para o escalonador dizendo:
“Ei, escalonador, essa seria uma boa hora para outras threads processarem.”

Caso o escalonador decida que é mesmo, ele faz a preempção.

Se quiser, entra no ponto v e veja o último artigo de java 2D, sobre o game loop. Lá tem um exemplo prático de yield.

Ok Vini, vou ler.

Valeu.

Uma observação.

Quando falar de yield() não pense no pool de threads paradas, em WAIT e em BLOCKING. É uma instrução relacionada ao algoritmo de escalonamento, ou seja, atua sobre as threads que estão executando.

Como explicou o marcio_gs, elas rodam não rodam efetivamente ao mesmo tempo, pois o número de processadores é geralmente menor que o número de threads. Portanto, o que o SO faz é dividir o tempo de processamento entre as várias, de modo a criar a ilusão de execução paralela.

O yield() é só um aviso para o SO, que esse seria um bom momento para uma preempção (a saída dela e troca por outra no processador) ocorrer.

Vou discordar nesse caso (embora via de regra isso seja realmente verdade, para outros usuários).

Algumas dúvidas dele são realmente muito inteligentes. Até eu já fui pego de calça curta. heheheheh
E a parte de threads consegue ser horrívelmente mal explicada, principalmente para quem não trabalhou com elas.