Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

stellarium

Problema com Threads... interrupt() e wait()

Mensagens Recomendadas

stellarium

Boa tarde 3b63d1616c5dfcf29f8a7a031aaa7cad.gif

A minha duvida prende-se com uma confusão de conceitos no que diz respeito aos métodos wait() e interrupt() das Threads que tenho sido obrigado a usar num projecto de programação que tenho de desenvolver...

Basicamente tenho duas imagens que tentam aceder a uma mesma célula provocando problemas de sincronização. Quando uma imagem detecta a outra na célula imediatamente a seguir lança um wait() e as imagens ficam em espera... A duvida chega aqui quando eu pretendo fazer as imagens moverem-se de novo. O notify()/notifyAll() não esta a funcionar neste caso não sei bem porque...

Basicamente, para tentar fazer as imagens moverem se de novo tenho um mouselistener que me procura a imagem, mete-lhe uma nova direcção e tenta-lhe fazer um notify (através do debug do eclipse consigo detectar que o programa chega a correr aqui, apenas parece nao fazer o notify)

Falaram-me de experimentar, depois da thread estar em wait(), de usar o mouselistener e, depois de mudar as posição, interromper a Thread, e que quando apanhasse a excepção provocada pelo interrupt(), fazer com que a Thread verifique novamente se se pode mover, se se poder faz o notify().

É aqui que nasce a minha duvida. Como é que apanhando a excepção faço-a verificar se se pode mover, dado que já está em wait() à espera de ser notificada?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

ok. ora bem.

> primeiro de tudo. tu tens no total 3 threads = 2 para manipular uma imagem cada + 1 da janela

a ideia fundamental a reter é : uma imagem não é uma thread, mas sim um objecto manipulado num thread.

e o thread da janela é a razão porque o mouseListener é executado, porque senão estava tudo parado.

ps :

não faço ideia porque razão é que será o rato a voltar a por tudo a andar, mas tu lá sabes

eu não ia gostar de ver tudo parado e ter que mover o rato ou outra coisa para por tudo a andar novamente ...

> segundo, como te disse acima, apesar do thread estar parado, não quer dizer que deixas de poder manipular a imagem. é isso que o mouseListener deverá fazer.

- verificar se o thread se encontra parado, e se sim

- alterar a direção da imagem associada ao thread

- notificar o thread para executar

conclusão : nada de interrupt ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
stellarium

Antes de mais nada obrigado pela resposta HappyHippyHippo ;)

Bom, esqueci-me de dizer que sim as imagens são objectos threads, peço desculpa (apenas disse imagens poq calhou).

A razao de ser o rato a voltar a por tudo a andar não é minha, foi do prof que fez o enunciado visto ser um trabalho de faculdade :)

Eu tinha uma variavel boolean no qual a thread só se movia se esta variavel estivesse a true... e o mouselistener, quando ela estava a false conseguia alterá-la e voltar com que a thread voltasse a mexer. Acontece que o prof nao gostou de que eu usasse a variável e disse que visto as threads estarem a competir por um recurso partilhado para eu usar wait() e notify().. epa só que nao funciona, não sei porque...

Diz me uma coisa. Quando as threads estão em wait() se eu as interromper não posso apanhar a excepção lançada pelo interrupt() e voltar a mandar mexer a thread? Se sim, como?

Obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
stellarium

for (int i = 0; i < importantInfo.length; i++) {
// Pause for 4 seconds
try {
	Thread.sleep(4000);
} catch (InterruptedException e) {
	// We've been interrupted: no more messages.
	return;
}
// Print a message
System.out.println(importantInfo[i]);
}

No exemplo quando é executado o "return;" a thread volta a fazer o seu run()?

Editado por Rui Carlos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.