faire un wait() sur un Thread déjà suspendu + comment killer 1 thread

faire un wait() sur un Thread déjà suspendu + comment killer 1 thread - Java - Programmation

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 ?
 
 :heink: spa très clair, hein ? Mais bon ... je suis pas encore au point :D


Message édité par bobuse le 28-08-2002 à 14:49:05
Reply

Marsh Posté le 28-08-2002 à 11:34:49   

Reply

Marsh Posté le 28-08-2002 à 11:38:13    

tu fais de la synchronisation directement sur un objet Thread  ? :heink:

Reply

Marsh Posté le 28-08-2002 à 11:40:58    

benou a écrit a écrit :

tu fais de la synchronisation directement sur un objet Thread  ? :heink:  




oui, pkoi ? :??:

Reply

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à  :(

Reply

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 !

Reply

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 ...

Reply

Marsh Posté le 28-08-2002 à 12:23:30    

ouaip ça marche ! :jap:  
Par contre, wait est final, donc je l'ai appelée newWait  :D  
 
voilà ske gé fé :
 
 

Code :
  1. public class testThread extends Thread {
  2.     boolean b;
  3.     public testThread() {
  4.         super();
  5.         b=false;
  6.     }
  7.     public void addWait() {
  8.         b=true;
  9.     }
  10.     synchronized public void newWait(long time) throws InterruptedException {
  11.         super.wait(time);
  12.         if (b) {
  13.             b = false;
  14.             wait();
  15.         }
  16.     }
  17. }

 
 
et ça fait exactement ce que je voulais  :jap:  :jap:


Message édité par bobuse le 28-08-2002 à 12:23:57
Reply

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 [:mojopin80] ) :
 
Comment on tue un thread :D  
 
J'imagine qu'on peut faire ça proprement, alors si vous avez une suggestion ... avant que je fasse un massacre :D  [:mojopin80]

Reply

Marsh Posté le 28-08-2002 à 13:30:11    

bobuse a écrit a écrit :

 
Comment on tue un thread :D  




En le faisant sortir de sa méthode run().

Reply

Marsh Posté le 28-08-2002 à 13:37:52    

Code :
  1. private boolean run = false;
  2. ...
  3. public void run() {
  4.    run = true;
  5.    while(run) {
  6.    }
  7. }
  8. public void kill() {
  9.    run =  false
  10.    // eventuellement un notify sur l'objet utilisé pour endormir ton thread
  11. }


Message édité par darklord le 28-08-2002 à 13:38:19
Reply

Marsh Posté le 28-08-2002 à 13:37:52   

Reply

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 ?

Reply

Marsh Posté le 28-08-2002 à 17:06:55    

bobuse a écrit a écrit :

ouaip ça marche ! :jap:  
Par contre, wait est final, donc je l'ai appelée newWait  :D  
 
voilà ske gé fé :
 
 

Code :
  1. public class testThread extends Thread {
  2.     boolean b;
  3.     public testThread() {
  4.         super();
  5.         b=false;
  6.     }
  7.     public void addWait() {
  8.         b=true;
  9.     }
  10.     synchronized public void newWait(long time) throws InterruptedException {
  11.         super.wait(time);
  12.         if (b) {
  13.             b = false;
  14.             wait();
  15.         }
  16.     }
  17. }

 
 
et ça fait exactement ce que je voulais  :jap:  :jap:




 
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 !

Reply

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é !

Reply

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 ... :hello:

Reply

Marsh Posté le 29-08-2002 à 14:39:26    

alors, ca donne quoi ?

Reply

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 !

Reply

Marsh Posté le 29-08-2002 à 15:46:21    

le destroy ne marche pas ?

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed