faire un wait() sur un Thread déjà suspendu + comment killer 1 thread - Java - Programmation
Marsh Posté le 28-08-2002 à 11:38:13
tu fais de la synchronisation directement sur un objet Thread ?
Marsh Posté le 28-08-2002 à 11:40:58
benou a écrit a écrit : tu fais de la synchronisation directement sur un objet Thread ? |
oui, pkoi ?
Marsh Posté le 28-08-2002 à 11:58:39
Bon en fait, je développe un jeu. Donc forcément j'ai quelques threads qui se charge de l'animation graphique.
Le truc, c'est que le joueur peut redémarrer le jeu, à ce moment un message de confirmation apparaît pour lui demander s'il est sûr (au cas où il a glissé sur la touche). Et pendant cette confirmation l'état du jeu est sauvegardé, pour être restaurer en cas d'annulation du redémarrage.
C'est pour ça que je regarde l'état des threads :
ceux qui sont en wait() : ils sont bien comme ça
ceux qui tournent : je les mets en wait()
et ceux qui sont en wait(timeOut), je voudrais suspendre le timer
c'est un peu pourri comme je fais, je sais ... mais j'ai pas le temps là
Marsh Posté le 28-08-2002 à 12:06:31
tu surcharge le wait(timeout) dans ton thread...
Je m'explique : quand tu feras wait(timeout), mettra a jour une variable pour dire qu'il est en wait(timeout) et ensuite, ca appelera super.wait(timeout).
Ensuite, tu surcharges le wait() qui lui mettra a jour une variable si le thread est deja en wait(timeout) ...
Dans wait(timeout), apres super.wait(timeout), tu verifie ta variable pour savoir si un wait() a été appelé.
Si oui : super.wait() sinon , ben rien et roulez jeunesse !
Voila, j'espere avoir ete clair sinon, ben a tout de suite !
Marsh Posté le 28-08-2002 à 12:07:50
chapi456 a écrit a écrit : tu surcharge le wait(timeout) dans ton thread... Je m'explique : quand tu feras wait(timeout), mettra a jour une variable pour dire qu'il est en wait(timeout) et ensuite, ca appelera super.wait(timeout). Ensuite, tu surcharges le wait() qui lui mettra a jour une variable si le thread est deja en wait(timeout) ... Dans wait(timeout), apres super.wait(timeout), tu verifie ta variable pour savoir si un wait() a été appelé. Si oui : super.wait() sinon , ben rien et roulez jeunesse ! Voila, j'espere avoir ete clair sinon, ben a tout de suite ! |
Ca me parait être pas mal, je vais y réfléchir ...
Marsh Posté le 28-08-2002 à 12:23:30
ouaip ça marche !
Par contre, wait est final, donc je l'ai appelée newWait
voilà ske gé fé :
Code :
|
et ça fait exactement ce que je voulais
Marsh Posté le 28-08-2002 à 12:27:25
Encore une question (fodra vraiment que je me fasse un topo sur les threads un de ces 4 ) :
Comment on tue un thread
J'imagine qu'on peut faire ça proprement, alors si vous avez une suggestion ... avant que je fasse un massacre
Marsh Posté le 28-08-2002 à 13:30:11
bobuse a écrit a écrit : Comment on tue un thread |
En le faisant sortir de sa méthode run().
Marsh Posté le 28-08-2002 à 13:37:52
Code :
|
Marsh Posté le 28-08-2002 à 14:45:51
vous êtes sympa, mais ça va pas être possible !
mon thread ne tourne presque pas en boucle. Il fait surtout un traitement long, et attend certains événement successivement.
Donc cette solution n'est pas envisageable !
ya bien un autre moyen, hein ?
Marsh Posté le 28-08-2002 à 17:06:55
bobuse a écrit a écrit : ouaip ça marche ! Par contre, wait est final, donc je l'ai appelée newWait voilà ske gé fé :
|
Ben c'est cool alors ... par contre, dans addWait(), tu devrais ajouter un test pour vérifier si tu est en attente ou pas car sinon, il risque de jamais se mettre en wait, s'il l'etait pas déja !
Marsh Posté le 28-08-2002 à 17:10:38
chapi456 a écrit a écrit : Ben c'est cool alors ... par contre, dans addWait(), tu devrais ajouter un test pour vérifier si tu est en attente ou pas car sinon, il risque de jamais se mettre en wait, s'il l'etait pas déja ! |
ouaip tout à fait, j'y avais pensé !
Marsh Posté le 28-08-2002 à 17:18:27
par contre, pour tuer le thread, je pense pas que ca soit faisable, non seulement 'syntaxiquement' mais surtout 'algorithmiquement', je m'explique :
Tu dis que ton run fait de longs traitements, il doit donc, pendant ce traitement agir sur d'autres objets, sur des variables, ... si tu le tues, brutalement, tu risques de laisser des objets dans un état tout à fait instable et c'est pas forcément terrible. Tu peux également te retrouver avec d'autres threads bloqués (death lock)
D'autre part, tu peux faire une méthode destroy qui appelle super.destroy() mais qui nettoie tout ton bordel avant (remise en place des variables, ...). Tu fais un petit notify pour reveiller les threads qui pourrait etre bloqués par le tien, et puis pof, tu le 'destroy'.
Contrairement a la soluce précédente, je ne garantis RIEN du tout, c'est pour le plaisir ...
Marsh Posté le 29-08-2002 à 15:35:11
chapi456 a écrit a écrit : alors, ca donne quoi ? |
pour le kill, j'ai pas encore trouvé de solution !
Marsh Posté le 29-08-2002 à 16:04:14
chapi456 a écrit a écrit : le destroy ne marche pas ? |
en fait j'ai pas encore essayé, je verrai plus tard ...
mais ça devrait http://java.sun.com/j2se/1.4/docs/ [...] ation.html
Marsh Posté le 28-08-2002 à 11:34:49
voilà mon pb :
J'ai un thread qui tourne, appelons-le thread1.
Ce thread à un moment est suspendu avec un TimeOut : thread1.wait(dureeTimeOut);
Mais voilà, à un autre moment j'aimerai suspendre ce thread pour de bon avec un wait() tout court.
Le problème est ce deuxième wait() va attendre la fin du premier avant de s'exécuter (car les deux sont dans des blocs synchronized sur thread1), et du coup mon thread1 est reparti dans son exécution le temps que le deuxième wait() agisse.
En gros ma question : comment rendre un wait() qui comporte un timer en un wait tout court ?
spa très clair, hein ? Mais bon ... je suis pas encore au point
Message édité par bobuse le 28-08-2002 à 14:49:05