wait e notify duvida [ RESOLVIDO]  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
tarzanDoido
Smalltalk

Membro desde: 01/04/2011 07:00:53
Mensagens: 2
Offline

Agora entendi. Obrigado pela explicação.
InsaneChess
JavaTeenager
[Avatar]

Membro desde: 22/04/2010 23:02:42
Mensagens: 194
Localização: São Paulo, SP
Offline

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?

MSN: diogo_chess@hotmail.com
Vamos estudar Java!!!
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Todo código synchronized é feito sobre um objeto.

Ou seja, vc faz assim:

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


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
InsaneChess
JavaTeenager
[Avatar]

Membro desde: 22/04/2010 23:02:42
Mensagens: 194
Localização: São Paulo, SP
Offline

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.

MSN: diogo_chess@hotmail.com
Vamos estudar Java!!!
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

InsaneChess wrote: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.


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

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
zariff
Smalltalk

Membro desde: 22/11/2011 17:38:35
Mensagens: 1
Offline

Desculpa acordar aqui, mas a linguagem usada nas respostas desse topico nao me ajudaram muito.
Tenho um problema:

-----------------------------------------------------------------------------------------------------------
dentro de um método run() tem um super.run() que chama 4 robôs para colocarem suas peças simultaneamente, depois de colocar, eles vao ter q revesar 1 ferramenta para parafusar sua peça. o método que ele chamou com super.run() faz com que os robos comecem a colocar a peça, depois q um terminou, ele ja começa a entrar na fila para pegar a ferramenta.

public void run(){
super.run();
ferramenta.adquirir();
try {
Thread.sleep(TempoParaParafusar);
} catch (InterruptedException ex) {})
ferramenta.release();
}
------------------------------------------------------------------------------------------------------------
public synchronized void adquirir() {
while (counter == 0) {
try {
wait();
} catch (InterruptedException ex) {
}
}
System.out.println("Adquirida ferramenta");
counter--;
}


public synchronized void release() {
System.out.println("Release ferramenta");
counter++;
notify();
}


Entendi que um robo vai colocar sua peça e esperar a ferramenta, também entendi esse processo que apenas 1 robo pode executar por vez úm método synchronized e, por isso, apenas 1 poderá estar com a ferramenta ao mesmo tempo. Pois enquanto um está parafusando, o proximo da fila está preso no wait.
Se eu retirar synchronized, ocorre o erro que já foi comentado mas ainda nao entendi porque.
Obrigado

This message was edited 1 time. Last update was at 22/11/2011 18:02:07

 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team