problème de Thread java

problème de Thread java - Java - Programmation

Marsh Posté le 09-11-2010 à 15:58:30    

Bonjour
j'apprend le java en autodidacte (novice) et je me retrouve confronté à un problème de Thread.
j'ai choisi d'implémenté une interface graphique en Java, malheureusement celle-ci se fige lorsque que le temps de traitement d'une méthode est long.
en suivant de nombreux tuto j'ai commencer à implémenter des Thread.
 

Code :
  1. public class Simulateur {
  2. //j'ai créé une variable de classe hérité de Thread  
  3. Threadtest a;
  4. //dans le constructeur de mon simulateur
  5. public Simulateur {
  6. a=new Threadtest();
  7. a.start();
  8. }
  9. //une méthode
  10. public void rafraichir (){
  11. //à cette instant a est à l'état terminé  
  12. a.start();
  13. }
  14. }
  15. public class threadtest extends Thread{
  16.     @Override
  17.     public void run(){
  18. //mon code  
  19.         }
  20. }


 
Bien que mon threadtest soit terminé ma méthode rafraichir ne parvient pas à exécuter le thread.
 
Merci pour votre aide.

Reply

Marsh Posté le 09-11-2010 à 15:58:30   

Reply

Marsh Posté le 09-11-2010 à 16:14:29    

Normal : un thread ne peut se "starter" qu'une fois.
 
Il faut qu'il soit en attente "d'ordres" (ex rafraichir) dans le run...  
 
Pour ce qui est de la synchro pour passer des "ordres", il faut passer par de la "synchro" entres threads : queue synchronisés, etc...
 
Mais attention : il ne faut pas se lancer dans le multi-threading à la légère. En fait ce n'est pas un truc de novice (mais bon il faut en passer par là  :)  ). Il faut concevoir la chose, car la synchronisation entre thread ne s'improvise pas : les risque de deadlock (freeze de l'appli) sont très facile à générer et très difficile à débugger...  
 
As-tu une idée plus précise de ce que tu veux faire faire à chaque "thread" pour que l'on puisse t'orienter?
 
Sinon, j'avais un article assez intéressant sur le concept :
http://www.drdobbs.com/go-parallel [...] =215900465
 
Bon courage


Message édité par dreameddeath le 09-11-2010 à 17:00:38
Reply

Marsh Posté le 09-11-2010 à 17:06:28    

Je réalise un simulateur de connexion IPV6 en projet.
Afin de rendre l’expérience plus didactique j'aimerais afficher des informations en cascade tout en étant lisible. Par exemple :
 
jLabel.setText("connexion en cours" );
thread.sleep(3000);  //try catch  
jLabel.setText("connexion établi" );
 
malheureusement l'interface se fige pendant 3 secondes et m’affiche uniquement "connexion établi".
De plus le nombre d'états possible est presque illimité et il ne me semble pas réaliste de créer un Thread pour chaque étape de la connexion.

Reply

Marsh Posté le 09-11-2010 à 17:28:53    

Je ne suis pas expert en GUI java (et l'aspect thread safe de l'ensemble), mais pour moi, ton thread peut faire "tout" le boulot de simulation (le code que tu as donné en exemple à mettre dans la méthode run)...
 
Par contre, il faut prévoir une machine d'état avec un "check" d'arrêt pour éviter d'attendre la fin de la simulation à chaque fois
 

Code :
  1. public enum simulation_states_connection = { SIM_BEFORE_CONNECT, SIM_CONNECTING ...,SIM_FINISHED};
  2. //dans le run
  3. states_connection curr_state;
  4. while (curr_state != SIM_FINISHED){
  5.      switch(curr_state){
  6.           case SIM_BEFORE_CONNECT:
  7.               jLabel.setText("Starting" );
  8.               //autres actions
  9.               sleep(100);
  10.               curr_state = CONNECTING;
  11.               break;
  12.           case CONNECTING:
  13.               //...
  14.           case
  15.      }
  16.      if(termination_request){
  17.          break;
  18.      }
  19. }


 
Pour ce qui est de la variable termination_request, il faut que ça soit une variable protégée par des accesseurs "synchronized"...
 
Il faudrait créer un thread à chaque début de simulation et bien le "terminer" avant d'en créer un autre.
 
En espérant que ça aide

Reply

Marsh Posté le 09-11-2010 à 17:38:08    

Merci pour ta réponse j'essaierai ca très bientôt.

Reply

Sujets relatifs:

Leave a Replay

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