Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1272 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°203676
bobuse
Posté le 28-08-2002 à 11:34:49  profilanswer
 

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
mood
Publicité
Posté le 28-08-2002 à 11:34:49  profilanswer
 

n°203680
benou
Posté le 28-08-2002 à 11:38:13  profilanswer
 

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

n°203683
bobuse
Posté le 28-08-2002 à 11:40:58  profilanswer
 

benou a écrit a écrit :

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




oui, pkoi ? :??:

n°203706
bobuse
Posté le 28-08-2002 à 11:58:39  profilanswer
 

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

n°203718
chapi456
Posté le 28-08-2002 à 12:06:31  profilanswer
 

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 !

n°203722
bobuse
Posté le 28-08-2002 à 12:07:50  profilanswer
 

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

n°203744
bobuse
Posté le 28-08-2002 à 12:23:30  profilanswer
 

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
n°203750
bobuse
Posté le 28-08-2002 à 12:27:25  profilanswer
 

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]

n°203797
krosso
j'suis à la bourre
Posté le 28-08-2002 à 13:30:11  profilanswer
 

bobuse a écrit a écrit :

 
Comment on tue un thread :D  




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

n°203805
darklord
You're welcome
Posté le 28-08-2002 à 13:37:52  profilanswer
 

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
mood
Publicité
Posté le 28-08-2002 à 13:37:52  profilanswer
 

n°203865
bobuse
Posté le 28-08-2002 à 14:45:51  profilanswer
 

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 ?

n°204081
chapi456
Posté le 28-08-2002 à 17:06:55  profilanswer
 

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 !

n°204086
bobuse
Posté le 28-08-2002 à 17:10:38  profilanswer
 

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

n°204101
chapi456
Posté le 28-08-2002 à 17:18:27  profilanswer
 

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:

n°204612
chapi456
Posté le 29-08-2002 à 14:39:26  profilanswer
 

alors, ca donne quoi ?

n°204673
bobuse
Posté le 29-08-2002 à 15:35:11  profilanswer
 

chapi456 a écrit a écrit :

alors, ca donne quoi ?




pour le kill, j'ai pas encore trouvé de solution !

n°204686
chapi456
Posté le 29-08-2002 à 15:46:21  profilanswer
 

le destroy ne marche pas ?

n°204706
bobuse
Posté le 29-08-2002 à 16:04:14  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
agir sur un groupe de thread, méthode activeCount()thread
classe anonyme et création de thread à la voléeMulti thread
[VC++]PB de thread[C++] Killer un thread, mais pas comme un gros cochon :o
Threadthread
[JAVA] probleme de thread 
Plus de sujets relatifs à : faire un wait() sur un Thread déjà suspendu + comment killer 1 thread


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR