Membro desde: 09/10/2003 14:23:31
Mensagens: 379
Offline
Gente alguém poderia dar um mamão com threads !?
Qual o problema com desse programa ???
[Code]
(...)
x = 997 y = 997 worker number 1
x = 998 y = 998 worker number 0
x = 999 y = 999 worker number 3
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notify(Native Method)
at TesteConsumer.run(TesteConsumer.java:23)
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notify(Native Method)
at TesteConsumer.run(TesteConsumer.java:23)
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notify(Native Method)
at TesteConsumer.run(TesteConsumer.java:23)
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notify(Native Method)
at TesteConsumer.run(TesteConsumer.java:23)
(...)
[/code]
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
Você não pode chamar wait, notify ou notifyAll se não possui a lock para o objeto.
http://www.kumpera.net/blog/ http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
Membro desde: 09/10/2003 14:23:31
Mensagens: 379
Offline
Como assim ???
Como eu faço para a Thread principal do programa esperar o trabalhadores terminarem o serviço??? Como os trabalhadores podem notificar a Thread principal que seu serviço terminou ???
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
Seguinte:
Vai lançar IllegalMonitorStateException
Não vai.
Entende isso primeiro, depois como wait/notify e synchronized interagem entre sí e por fim resolve seu problema.
http://www.kumpera.net/blog/ http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
Membro desde: 09/10/2003 14:23:31
Mensagens: 379
Offline
Mmm... isso significa que eu não posso sair assim notificando os threads!
Minha solução foi passar o employer (Thead principal) para os trabalhadores via construtor. Ai eu usei o syncronized (employer) { employer.notify()};
e tudo passou a funcionar.
---
Comentário: Em Perl, por exemplo, existem milhões de formas de resolver um mesmo problema. Muitas vezes o que a gente não sabe, é (qual) a maneira adequada para resolver um problema. Não imaginei que não fosse possível resolver sem usar syncronized(object) porque em vários lugares dizia-se que isto tem o mesmo efeito de utilizar o modificar syncronized no método.