Thread wait e notifyAll - Duvida  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
jjose
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

Duvida,

A threadC não continua, não recebe o notifyAll da ThreadA.



Sabem o motivo?

Vlw

Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
yastorm
JavaChild
[Avatar]

Membro desde: 28/03/2010 00:21:08
Mensagens: 128
Offline

Acho que é porque o contexto da sincronização na main Thread está no objeto b. Logo, o notifyAll irá propagar apenas para a Thread b, pos a Thread c está sincronizando para si mesmo.

Sun Certified Programmer for Java 2 Platform 1.6
Sun Certified Web Component Developer for the Java Platform 5
Next -> SCBCD
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

yastorm wrote:Acho que é porque o contexto da sincronização na main Thread está no objeto b. Logo, o notifyAll irá propagar apenas para a Thread b, pos a Thread c está sincronizando para si mesmo.


Exatamente. O Notify (ou notifyAll, como neste caso) "notifica" somente a(s) thread(s) que estiverem aguardando no objeto em que você chama o notify (ou notifyAll).

A Thread C ficará aguardando eternamente, já que você nunca chama notify no objeto que representa a thread C, que por acaso é o objeto em que ela espera.

http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
jjose
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

Entendi, nesse caso , basta eu colocar um notify para C tambem.

O que eu queria é ver o notifyAll propagando a liberação de mais thread, alguem sabe como fazer isso no exemplo?

Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

Você pode, por exemplo, criar um objeto no metodo main, e passar ele para ambas as threads, B e C, via construtor, e fazê-lar dar wait neste objeto. Assim no main, você dá um notifyAll neste objeto e ambas as threads B e C serão afetadas. Só tome cuidado que seu código é arriscado: Main pode invocar notifyALL antes que uma das threads B ou C, ou até mesmo as duas tenham invocado wait. Neste caso as duas ficaram aguardando para sempre.

http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
jjose
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

rod.attack wrote:Você pode, por exemplo, criar um objeto no metodo main, e passar ele para ambas as threads, B e C....

This message was edited 3 times. Last update was at 13/06/2010 15:45:37


Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
yastorm
JavaChild
[Avatar]

Membro desde: 28/03/2010 00:21:08
Mensagens: 128
Offline

Acho que você não entendeu o que o amigo quis dizer. As três Threads precisam ter um objeto em comum. As Thread b e c não fazem ideia de que a Thread a existe.

Olhe abaixo:


Olhe esse exemplo que tirei do livro da Kathy. Os objetos Reader tem um objeto Calculator em comum. Esse é o elo de ligação entre o notify.

Sun Certified Programmer for Java 2 Platform 1.6
Sun Certified Web Component Developer for the Java Platform 5
Next -> SCBCD
jjose
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

yastorm wrote:Acho que você não entendeu o que o amigo quis dizer. As três Threads precisam ter um objeto em comum. As Thread b e c não fazem ideia de que a Thread a existe.

Olhe abaixo:


Olhe esse exemplo que tirei do livro da Kathy. Os objetos Reader tem um objeto Calculator em comum. Esse é o elo de ligação entre o notify.


Eu tinha visto esse exemplo e o que pegou dele é, com ou sem o notifyAll o resultado é o mesmo.

Estou boiando nesse notifyAll

Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
jjose
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

Ninguem? Hehehe

Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Rode o programa abaixo e veja por que talvez você esteja tendo problemas.

De modo geral, wait + notify é a mesma coisa que goto para threads; é uma forma muito básica e muito difícil de usar. Se precisar de sincronização entre threads, use alguma classe de java.util.concurrent.

 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team