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
7 Respostas
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.
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.
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
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?
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.
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.
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.
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.
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.
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?
Putz, não sei não. Eu nunca fiz o exame.