Java for dummies

Java for dummies

por Daniel Santos -
Número de respostas: 7

Gente. to apanhando um pouco do java.. Estou tentando utilizar os metodos wait() e notify(), mas ele sempre da este erro:

java.lang.IllegalMonitorStateException
 at java.lang.Object.wait(Native Method)
 at java.lang.Object.wait(Object.java:485)
 at Estrada.main(Estrada.java:16)

estou usando da seguinte forma para testes na main:
          
            threadEx.execute( task1 ); // start task1
            task1.wait(); // bloqueia task1
            threadEx.execute( task2 ); // start task2
            task1.notify(); // acorda task1

Estou fazendo algo errado??


         

Em resposta à Daniel Santos

Re: Java for dummies

por Alfredo Goldman -
Olá Daniel,
Não sei se você estava na aula de hoje, mas comentei como funcionam
os monitores em Java. O wait() funciona em relação a objetos, e não a
threads. Isto é, em um objeto posso fazer um wait() (o qual bloqueia
a thread sendo executada neste objeto).
Procure alguns exemplos de código no link que está no EP.

Alfredo
Em resposta à Alfredo Goldman

Re: Java for dummies

por Alexandre Pitta Guedes -
Podemos fazer só wait() e notifyAll()? Sem se preocupar só com notify().

Minha preocupação é pelo seguinte:

O carro pede pra entrar no trecho. Enquanto tem algum carro muito no inicio do trecho, o carro que quer entrar fica no wait (vou chamar de wait1)
enquanto ultimo carro muito no inicio > wait

Saindo deste laço o trecho insere ele no inicio do trecho e deixa ele wait (vou chamar de wait2) até que o carro chegue ao final do trecho.
enquanto eu não terminei de percorrer todo o trecho > wait

E os notify's ocorrem quando cada carro é movido.
Move carro 1, notify. Move carro 2, notify...

Minha duvida é: Corro o risco de cada um destes notify's serem "ouvidos" apenas pelo wait2 e com isso, um carro que poderia entrar no trecho ficaria fica "preso"?

Ou a ordem na fila funciona aqui? exemplo:
O carro1 que já está no trecho, está esperando no wait2, ele é o primeiro da fila (esperando o notify).
O carro2 que está querendo entrar no trecho, está no wait1. ele é o segundo da fila (esperando o notify).

Quando um carro é movido pelo trecho, e esse dá o notify, o primeiro a ouvir é o carro1 no wait2; ele verifica que não terminou o trecho ainda e por isso precisa voltar pra wait2. Mas aqui é como se ele entrasse na fila novamente, certo? Agora ele passa a ser ultimo da fila (esperando o notify), e por isso o proximo notify vai ser ouvido pelo carro2 no wait1 que poderá entrar no trecho se já tiverem liberado a entrada.





Em resposta à Alexandre Pitta Guedes

Re: Java for dummies

por Alfredo Goldman -
Olá Alexandre,
No java, a fila de espera é geralmente respeitada, quem chegou antes é
acordado primeiro. Não entendi bem o quê você quiz dizer com wait1 e wait2,
se eles forem em objetos diferentes, eles dependem de notifys distintos. Caso contrário vale a fila. Lembre-se que a fazer um notifyAll, todos os processos esperando ficam habilitados a entrar no monitor.

Alfredo
Em resposta à Alfredo Goldman

Re: Java for dummies

por Alexandre Pitta Guedes -
Sim, são no mesmo objeto, então vale a fila.

Só pra esclarecer pra quem possa estar interessado.

Meu metodo "entra no trecho" da classe Trecho (metodo que é chamado pelo carro) está mais ou menos assim:

  1. enquanto tem algum carro muito no inicio do trecho, wait
  2. carro é colocado no trecho
  3. enquanto carro não terminou de percorrer todo o trecho, wait.
  4. "volta" pro loop (tempo aleatorio, escolher velocidade, tentar entrar proximo trecho)
São 2 waits no metodo, por isso chamei de wait1 e wait2.


Em resposta à Alexandre Pitta Guedes

Re: Java for dummies

por Daniel Santos -

Com da pra fazer 2 waits diferentes? achei q era simplesmente wait

Nos precisamos nos preocupar com aquele "spontaneous wekeUp" que acorda processos aleatórios no JAva?

Em resposta à Daniel Santos

Re: Java for dummies

por Alfredo Goldman -
Olá Pessoal,
Após quase uma semana sem acesso a Internet, volto a ter acesso.
O nome correto é spurious wakeup (tem bastante referência na WEB).
O fenômeno é raro, mas pode ocorrer.
Quando a usar dois waits diferentes, é possível, basta usar dois locks
(de objetos) distintos.
Não respondi às dúvidas anteriores, pois acho já passou muito tempo.
Se houver dúvidas adicionais, mandem para a lista.

Alfredo
Em resposta à Daniel Santos

Re: Java for dummies

por João Paulo Mota -
Eu li em algum lugar que wait e notify só podem ser usados dentro de blocos synchronized. Eu acho que esse não deve ser seu problema mas fica a "dica".