Yield

7 respostas
F

alguem tem um exemplo pratico para explicar como um public static void yield() funciona?
de acordo com que li ate agora:o metodo yield faz com que um thread que esta sendo executado
passe a ser esecutavel afim dedar prioridade para outros threads

7 Respostas

sergiotaborda

fabioEM:
alguem tem um exemplo pratico para explicar como um public static void yield() funciona?
de acordo com que li ate agora:o metodo yield faz com que um thread que esta sendo executado
passe a ser esecutavel afim dedar prioridade para outros threads

yield() é um método deprecated. Use sleep() em vez.

ViniGodoy

O yield é deprecated?
Acho que não: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#yield()

Com o Yield você diz ao sistema operacional o seguinte:
“Agora seria um bom momento de você trocar as threads.”

O yield não obriga o sistema operacional a fazer isso, e não há garantias de que outras threads irão processar. Porém, na maior parte das vezes, se existem outras threads isso realmente ocorre. Use o yield se você está fazendo um processamento intenso, contínuo e seu usuário não se importa de esperar por ele. Por exemplo, durante a carga do seu aplicativo, no game loop de um jogo, ou mesmo em algum cálculo matemático obrigatório.

Com o sleep você tem uma garantia. Com o sleep você está dizendo:
“So, vou dar uma parada, me acorde daqui a N milisegundos”.
Use o sleep sempre que você quiser que sua thread não sobrecarregue o sistema. A pausa que a thread dá libera o processador. Também é uma boa usar o sleep para fazer timers, ou processar de tempos em tempos em background.

sergiotaborda

ViniGodoy:
O yield é deprecated?
Acho que não: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#yield()

Não que ele esteja marcado com @deprecated. Acontece que ele não é confiável e
por isso Sleep deve se usado. O sleep não garante que a thread comece a correr daqui a N segundos
apenas que daqui a N segundos ela será agendada.
Logo, se fizer sleep(1) isso irá agendar a thread daqui a um milisegundo , ou seja “já”. Só que se existirem outras threads
agendadas elas terão a chance de correr primeiro. No fim das contas tlv a mesma thread corra de novo mas o que importa é que sleep(1) concerteza pára a thread corrente dado chance às outras, enquanto yield não garante isso.

Outra boa prática de trabalho com threads é usar sempre notifyAll e não notify mesmo quando só ha uma thread esperando. É que notifiyAll garante que todas serão avisadas, enquanto que notifiy não garante isso podendo levar a leaks.

É um boa prática de trabalho com thread não usar yield e sim sleep. É neste sentido que yield está deprecated.
(outra razão para usar sleep é que ela lança uma exception se a thread tiver sido desabilidata entretanto, enquanto yield não)

Claro que vc pode usar em casos muito especificos quando não interessa realmente qual thread corre a seguir, mas normalmente vc quer que outras threads corram e não a mesma.

Em java, trabalhar com threads tem poucas garantias então é boa idéia preferir os métodos que dão mais garantias

Andre_Brito

Não são diferentes? O yield(), pelo que li na documentação pára a Thread, enquanto a sleep(x) faz dormir por x milisegundos. Não quero parecer bobo, mas lá vai…

O yield(), pelo que pude pesquisar (um pouco), pergunta para as outras threads se elas querem usar o recurso. Se as threads não querem, ela volta a pegar o recurso. Já, o sleep(x), dorme por x milisegundos, mas quando acordar, a thread vai voltar e não importa se existem threads querendo o recurso, porque o mesmo vai ser só dela???

Vish, acho que falei coisa errada, mas não dá nada.

Dei uma pesquisada e achei um perdido aqui falando alguma coisa.

Vejam o exeplo que ele dá:

http://www.thescripts.com/forum/thread655676.html

Abraço e foi mal se falei coisa errada…

Edit:
Lendo melhor, pude perceber que sleep() também lança uma exceção (não lembro qual)… então tipo… acho que é melhor usar porque já existe o tratamento de erro, que hoje em dia é MUITO importante… ainda mais com Thread, que chega a ser um pouco de baixo nível…

Edit 2:
Na verdade, acredito que não tem “a melhor”. Ambas são para aplicações diferentes, não são?

ViniGodoy

Não garantir isso é uma das vantagens do yield. Quer dizer, se você tiver isso em mente, e acreditar que o SO é realmente capaz de decidir se a thread deve parar ou não, é uma vantagem. Particularmente, não vejo muita diferença de usar yield() ou sleep(1). Nunca tive problemas com nenhum do dois, nem no Linux, nem no Windows.

sergiotaborda:

Outra boa prática de trabalho com threads é usar sempre notifyAll e não notify mesmo quando só ha uma thread esperando. É que notifiyAll garante que todas serão avisadas, enquanto que notifiy não garante isso podendo levar a leaks.

Não leaks, mas deadlocks. Eu concordo com você nesse ponto. Acordar só a próxima thread da fila nem sequer faz sentido. A menos que você esteja só trabalhando com 2 threads. Ainda assim, sistemas crescem e usar o notifyAll não tem um impacto tão significativo na performance assim que valha a pena abrir mão dele.

sergiotaborda:

Claro que vc pode usar em casos muito especificos quando não interessa realmente qual thread corre a seguir, mas normalmente vc quer que outras threads corram e não a mesma. Em java, trabalhar com threads tem poucas garantias então é boa idéia preferir os métodos que dão mais garantias

É, foi mais ou menos o que eu ressaltei ali. O yield não garante quase nada. Ele é só uma dica para o SO. São realmente poucas as aplicações dele e eu geralmente prefiro o sleep também.

F

ViniGodoy:
sergiotaborda:

Não que ele esteja marcado com @deprecated. Acontece que ele não é confiável e
por isso Sleep deve se usado. O sleep não garante que a thread comece a correr daqui a N segundos
apenas que daqui a N segundos ela será agendada.
Logo, se fizer sleep(1) isso irá agendar a thread daqui a um milisegundo , ou seja “já”. Só que se existirem outras threads
agendadas elas terão a chance de correr primeiro. No fim das contas tlv a mesma thread corra de novo mas o que importa é que sleep(1) concerteza pára a thread corrente dado chance às outras, enquanto yield não garante isso.

Não garantir isso é uma das vantagens do yield. Quer dizer, se você tiver isso em mente, e acreditar que o SO é realmente capaz de decidir se a thread deve parar ou não, é uma vantagem. Particularmente, não vejo muita diferença de usar yield() ou sleep(1). Nunca tive problemas com nenhum do dois, nem no Linux, nem no Windows.

sergiotaborda:

Outra boa prática de trabalho com threads é usar sempre notifyAll e não notify mesmo quando só ha uma thread esperando. É que notifiyAll garante que todas serão avisadas, enquanto que notifiy não garante isso podendo levar a leaks.

Não leaks, mas deadlocks. Eu concordo com você nesse ponto. Acordar só a próxima thread da fila nem sequer faz sentido. A menos que você esteja só trabalhando com 2 threads. Ainda assim, sistemas crescem e usar o notifyAll não tem um impacto tão significativo na performance assim que valha a pena abrir mão dele.

sergiotaborda:

Claro que vc pode usar em casos muito especificos quando não interessa realmente qual thread corre a seguir, mas normalmente vc quer que outras threads corram e não a mesma. Em java, trabalhar com threads tem poucas garantias então é boa idéia preferir os métodos que dão mais garantias

É, foi mais ou menos o que eu ressaltei ali. O yield não garante quase nada. Ele é só uma dica para o SO. São realmente poucas as aplicações dele e eu geralmente prefiro o sleep também.

valeu Vinny realmente essa parte acho a mais dificil de entender!!No exame que tu saiba cai muito?

ViniGodoy

Putz, não sei não. Eu nunca fiz o exame.

Criado 1 de janeiro de 2008
Ultima resposta 2 de jan. de 2008
Respostas 7
Participantes 4