Problemas EP2

Problemas EP2

by Felipe José Cardoso Bülle -
Number of replies: 11

Estou com um problema no meu EP e não sei se o problema é técnico (estou programando errado) ou se o problema é conceitual (estou modelando o problema errado).

Eu imaginei carros como objetos que implementam Runnable.

Há também os objetos Trecho, com o método entraNoTrecho.

Quando a thread de cada um dos carros é inicializada, elas chamam o método entraNoTrecho para o primeiro trecho.

O trecho então, por sua vez, começa a controlar o movimento do carro, atualizando sua posição a cada interação da simulação.

Quando um carro termina o trecho, eu gostaria de avisar ao carro que terminou para ele executar o entraNoTrecho para o segundo trecho.

Mas isso não dá certo. Eu dou um Wait para cada carro antes de finalizar o método entraNoTrecho, com a condição de verificação que vê se a posição do carro ainda pertence ao trecho. Com isso o carro espera. Enquanto o trecho atualiza os carros que estão nele, ele verifica se algum saiu do trecho. E aí então lança um notify().

Esse notify() deveria tirar o carro do wait(), fazendo ele terminar o método entraNoTrecho e permitindo-o ir para o próximo.

Mas esse meu notify não tá funcionando.

Tentei várias maneiras e não funfa...

Alguém tem alguma dica que possa me ajudar?

Valeu!

Depois de percorrer o primeiro trecho

In reply to Felipe José Cardoso Bülle

Re: Problemas EP2

by Alexandre Pitta Guedes -
Eu fiz algo parecido e aqui funcionou.
A diferenca é que sempre que eu movo um carro eu dou notify e quem verifica se ele terminou ou não de percorrer o trecho é o laço como wait lá no metodo entraNoTrecho.

Na verdade eu faço esses notify's toda vez que um carro é movido porque eu estou usando "vários" waits agora que tem guardas e tal, mas realmente, pela logica que você descreveu 1 notify quando o carro termina o trecho parece ser suficiente.

Uma solução que eu tive que usar também é wait(miliseconds)
Vai ter caso que só vai ter um carro em um trecho e ele pode ficar esperando um notify que só viria se tivesse outro carro lá... então com esse wait(miliseconds) ele espera o notify OU o tempo em milisegundos.
In reply to Alexandre Pitta Guedes

Re: Problemas EP2

by Lucas C. dos Santos -
Para que os waits e notify's funcionem direito vc precisa pegar o monitor do objeto
para a thread atual...

isso significa que o wait e o notify no objeto carro devem ser executados ou
num método syncronized do carro, ou em um bloco sincronizado pelo carro:

synchronized(carro) {
carro.wait();
...
carro.notify();
}

não precisa ser dentro do mesmo bloco sincronizado, mas as duas chamadas
precisam estar sincronizadas no *carro*
In reply to Lucas C. dos Santos

Re: Problemas EP2

by Alexandre Pitta Guedes -
Mas o "monitor" dos carros não é o trecho?

Ninguem mais "entra" na classe carro a nao ser o proprio carro, então nao tem pra que seus metodos serem synchronized, não?

Bom, o que foi falado na ultima aula a respeito do EP é que a classe Carro não cuidaria de praticamente nada, que quem controla é o Trecho...

O metodo na class Carro é algo do tipo:

void entraNoTrecho(int i) {
trechos[i].colocaCarroNoTrecho(this)
}

e os metodos na classe Trecho são +/- assim:

void synchronized colocaCarroNoTrecho(Carro carro) {
carros_no_trecho.add(carro);

while(carro.nao_terminou_trecho){
wait(); // ou seja, wait no monitor do trecho
}
}

void synchronized moveCarro(Carro carro){
carro.posicao+velocidade;
if(carro.posicao > tamanho_do_trecho){
carro.nao_terminou_trecho = false;
notify();
}
}


In reply to Alexandre Pitta Guedes

Re: Problemas EP2

by Carlos Eduardo Moreira dos Santos -
Isso de o monitor ser o trecho eu também ainda não entendi. Eu fiz como o Felipe, ou seja, só há synchronized, wait e notify no Carro que precisa saber quando sai de um trecho para pedir para entrar no outro.
In reply to Carlos Eduardo Moreira dos Santos

Re: Problemas EP2

by Felipe José Cardoso Bülle -

Então Carlos...

eu resolvi fazendo o trecho executar o seguinte código quando o carro entrou nele mas ainda não saiu...

Syncronized(carro){

carro.wait();

}

quando o trecho perceber que o carro saiu dele, o trecho faz:

Syncronized(carro){

carro.notify();

}

Assim deu certo...

In reply to Felipe José Cardoso Bülle

Re: Problemas EP2

by Alfredo Goldman -
Olá Pessoal,
Cuidado, a sincronização nos carros não funciona para o nosso problema.
Desta forma você garante exclusão em quem quer usar os carros, e não entre
eles. Por isto, a ideia é usar um controle de acesso nos objetos trecho.
Ficou mais claro ?

Alfredo
In reply to Alfredo Goldman

Re: Problemas EP2

by Felipe José Cardoso Bülle -
Para sincronização dos trechos eu não utilizei o lock do objeto carro, e sim do objeto trecho.
Mas para conseguir mandar o carro dormir (entrando em um trecho) e depois acordá-lo (saindo do trecho), eu utilizei o lock do objeto carro. Está errado?
In reply to Felipe José Cardoso Bülle

Re: Problemas EP2

by Alfredo Goldman -
Olá Felipe,
Fazer o lock nos próprios carros pode funcionar bem também, só
acho que fica um pouco mais complicado (mas isto é opinião pessoal).

Alfredo