stellarium Posted December 14, 2012 at 11:41 PM Report #487199 Posted December 14, 2012 at 11:41 PM Boa tarde 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?
HappyHippyHippo Posted December 15, 2012 at 12:12 AM Report #487203 Posted December 15, 2012 at 12:12 AM 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 Portugol Plus
stellarium Posted December 15, 2012 at 04:31 PM Author Report #487258 Posted December 15, 2012 at 04:31 PM 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!
HappyHippyHippo Posted December 15, 2012 at 05:07 PM Report #487263 Posted December 15, 2012 at 05:07 PM vê este exemplo : http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html como o método sleep segue o mesmo modelo do wait, podes sem problemas apanhar os interrupts do thread porque a exceção acorda o thread. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
stellarium Posted December 15, 2012 at 05:28 PM Author Report #487265 Posted December 15, 2012 at 05:28 PM 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()?
HappyHippyHippo Posted December 15, 2012 at 05:33 PM Report #487266 Posted December 15, 2012 at 05:33 PM é um exemplo ... é claro que com o return, o thread é terminado IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
stellarium Posted December 15, 2012 at 05:48 PM Author Report #487269 Posted December 15, 2012 at 05:48 PM Ok, muito obrigado acho que já entendi o que devo fazer 😉
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now