Wait e notify duvida [ RESOLVIDO]

ae pessoal maior duvida em usar wait() e notify() a teoria deu para entender mais tanto implementar nunca consigo, nem saber aonde exatemente colcoar eles que mpuder dar esse help na implementacao bastante simples para que possa entender… fico agradecido… thread’s eh uma loucura… essa ideia de nao ser seguro me deixa inseguro rs!!

O que te deixa em dúvida?
Tente explicar o que pretendes fazer.

Até!

Oi Camilo.

O wait() e o notify() são usados quando você precisa que uma thread espere por alguma condição.

O wait() indica que a thread() deve esperar. Ele é sempre colocado dentro de um while, contendo a condição em que a thread deve se manter esperando. O notify() indica que a thread deve acordar e verificar a condição.

Um exemplo clássico onde o wait() e notify() são usados é no algoritmo do produtor/consumidor. Imagine que você tem uma thread que enche uma lista. E outra thread que processa os dados dessa lista. Pois bem, temos duas situações:

  1. A thread produtora é mais rápida que a consumidora. Logo, a lista ficará cheia e o produtor deve esperar;
  2. A thread consumidora é mais rápida que a produtora. Logo, a lista ficará vazia e a thread consumidora deverá esperar.

Fiz um algoritmo que demonstra isso nesse post, você pode conferir:
http://www.guj.com.br/posts/list/50466.java#265167

Achei ele meio complexo e pouco didático. Por isso elaborei esse outro exemplo. Aqui existe uma thread fazendo um processamento (que nesse caso é ficar imprimindo constantemente algo num JTextArea). Outra thread controla a thread impressora, pedindo para ela pausar ou continuar a impressão.

A condição que vigiaremos no wait() é se a thread está parada ou não. Informaremos a thread que ela deve prosseguir com um notifyAll(). Deixei o algoritmo bastante comentado. Ainda assim, qualquer dúvida, entre em contato!

1 curtida

opa!! boa vinny!! vo udar uma olhada!!!

Parabéns ViniGodoy, estava procurando algo para compreender o funcionamento do wait() e o notify() e o seu codigo ajudou muito !!!

Abraços !!!

Valeu. Daqui a pouco você pode dar parabéns pro código, já que ele vai fazer aniversário. :lol:

hauha pior que é :smiley:

:wink: olha tambem tinha uma duvida para usar wait e notify, este exemplo ajudou muito…

Olha q daqui a pouco esse código vai pegar uma carteira de motorista!
Me esclareceu dúvidas tb!! :smiley:
Abraços!

Dei uma ressuscitada no tópico…
mas só pra falar que me ajudou pra caramba tbm!!

excelente!!!

:smiley:

3 aninhos! \o/

Vlw cara ajudou mt essa explicação.

=)

Não entendi uma coisa.

os métodos wait() e notify() não deveriam ser chamados pala Thread? No exemplo do vinny, os métodos estão sendo chamados pela classe Impressora, porém não consigo enchergar como essa classe chama um método (que não recebe a classe ImpressoraRun como parâmetro, por exemplo) e pausa essa Thread.

O que “liga” as duas classes para uma parar a outra com um método sem retorno e sem parâmetro?

Só outra coisinha… pra que serve o método setDaemon(boolean on) da Thread.

Obrigado

Threads e classes são coisas distintas.

Thread é a linha de execução. Uma thread vai rodando o programa linha-a-linha, e pode percorrer classes e objetos.
Quando a thread chama o wait, a thread que o chamou dorme, independente de qual classe esteja este wait.

Não confunda o conceito de thread (linha de execução) com a classe Thread do java (classe que dispara uma thread).

Olás,

pelo que entendi de thread
o wait funciona em qualquer ambiente
syncronized ou com o lock do objeto.

exemplo:

se você utilizar um bloco syncronized dentro de um programa que não seja thread ele
só irá requerer que para aquele trecho de código é obrigatório que se tenha o lock do objeto para
se executar, já o wait() irá parar as threads que passarem por ali não que necessariamente a classe
tenha que ter herdado Thread. Entretanto o bloco syncronized só faz sentido utilizando thread que será
o único jeito de se ter um processamento “paralelo” de uma área critica.

Resumindo você pode colocar ambiente syncronized a torto e a direito em suas classe se há possibilidade
de a mesma ser utilizada por uma thread.

att,

Agora entendi. Obrigado pela explicação. :smiley:

Desculpem ressucitar o tópico, porém tenho uma dúvida sobre Threads…após ver o exemplo do ViniGodoy

Não sei se vou conseguir explicar exatamente a dúvida…Vou me esforçar xP

1-Digamos que a Thred A1 esteja executando um método dentro do Objeto B;
2- O Objeto B utiliza o Wait() e faz a Thread A entrar em estado de espera.
3- A Thread A2 inicia.

Para a Thread A2 “Despertar” a Thread A1, ela precisa utilizar o NotifyAll() dentro do Objeto B que foi onde a Thread A começou a dormir,
ou qualquer Objeto do código que a Thread A2 utilizar NofifyAll() a ThreadA e todas as outras threas dormindo iram acordar?

Todo código synchronized é feito sobre um objeto.

Ou seja, vc faz assim: synchronized (umObjeto) { }

Quem dormir sobre esse objeto (umObjeto) só acordará com notify() ou notifyAll() dados por threads que tenham entrado num bloco sincronizado com o mesmo objeto.

E se você não declarou um synchronized dessa forma, e sim através do nome do método? É equivalente a declarar com

synchronized (this) { }

Entendi,
Então quando uma Thread dormir possuindo a chave de um Objeto, somente á outra Thread que obter a chave desse objeto poderá acorda-lá. É isso?

E tipo, então o Wait() / Notify() só podem ser utilizados em códigos Syncronizados e não em normais?

Obrigado pela atenção.

[quote=InsaneChess]Entendi,
Então quando uma Thread dormir possuindo a chave de um Objeto, somente á outra Thread que obter a chave desse objeto poderá acorda-lá. É isso?

E tipo, então o Wait() / Notify() só podem ser utilizados em códigos Syncronizados e não em normais?

Obrigado pela atenção.[/quote]

Isso mesmo. Fora desses blocos os métodos disparam uma IllegalMonitorStateException. Monitor é o nome que o java dá para o objeto chave.