| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/04/2011 08:03:00
|
tarzanDoido
Smalltalk
Membro desde: 01/04/2011 07:00:53
Mensagens: 2
Offline
|
Agora entendi. Obrigado pela explicação.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/09/2011 15:28:02
|
InsaneChess
JavaTeenager
![[Avatar]](/images/avatar/aaf00ecab185d81021300866bdfa4760.jpg)
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!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/09/2011 20:53:42
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 10:30:10
|
InsaneChess
JavaTeenager
![[Avatar]](/images/avatar/aaf00ecab185d81021300866bdfa4760.jpg)
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!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 16:51:02
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/11/2011 18:00:09
|
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
|
|
|
 |
|
|