o método yield faz com que a thread atual pare de executar e permite que outras threads com a msm prioridade sejam executadas…
M
marcio_gs
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.
A
andeb
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)
R
rmala_ti
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?
R
rmala_ti
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.
V
ViniGodoy
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.
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.
V
ViniGodoy
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.