IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Synchronisation de deux threads qui n'ont pas le même temps d'attente


Sujet :

avec Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 172
    Points : 55
    Points
    55
    Par défaut Synchronisation de deux threads qui n'ont pas le même temps d'attente
    bonjour à tous,
    mon problème et comme suit:
    j'ai deux threads
    thread 1{
    // instructions
    appel à threads 2();

    }

    le threads 1 se met en attente de 0.05 second, tandis que le thread2 se met en attente de 0.4 second
    de se fait le programme se bloque car le temps d'attente de thread1 s'écoule avant que le tread2 termine l'exécution de ses instructions.
    il y t'il une idée ?
    merci d'avance pour l'aide

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si tu veux attendre la fin d'un Thread, il y a la méthode join() sur le thread en question. Sinon, poste ton code, parce que là on est dans le flou artistique.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 172
    Points : 55
    Points
    55
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void performBehavior(){
    		while ((this.distance(xr,zr,this.tab_obj[0],this.tab_obj[1]))!=0.0){
     
    		this.control();
     
        	 if (this.pointeur>1){
        		 while ((this.distance(xr,zr,this.tab_obj[2],this.tab_obj[3]))>1){
        			 this.control();
     
        		 }
        		 this.pointeur=1;
        	 }
        		}
     
     
     
    	}
    voici mon code
    en faite la méthode performBehavior() est une méthode qui s'exécute chaque 0.05 second, tandis que la méthode control() est en synchronisation avec un thread dont le temps d'attente est 0.4 second.
    et voici le code de la méthode control
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public synchronized void control() {
     
     
     
     
    	 		double trans[]=this.reactivecontroller();
     
    	 		tv=trans[1];
    			double angle = Math.toRadians(trans[0]);
     
    			this.transationalvelocity(tv); // exécuter une vitesse linéaire
    			monthread m=new monthread(angle);
    			Thread th=new Thread(m);
    			th.start();
    			try {
    				th.join();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
     
    			try{wait(200);}
    			 catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    et voici le code de thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public class monthread implements Runnable {
    			  double k;
    				monthread(double x){
    					this.k=x;
    				}
    			public void run() {
     
    				setRotationalVelocity(k);
     
    			      try {
    			        // pause
    			        Thread.sleep(1000);
    			        setRotationalVelocity(0);
    			      }
    			      catch (InterruptedException ex) {}
    			    }
    			  }	
     
    		public void run() 
    		{
     
    			this.distance1=this.majdistance();
    			for (int i=0;i<nbsensors;i++){
    				TC1[i]=this.tempcollision1(distance1[i]);
    			}
    			this.distancemin0=this.distanceminimale();
     
     
    			try {Thread.sleep(400);
    			this.distance2=this.majdistance();
    			for (int j=0;j<nbsensors;j++){
    				TC2[j]=this.tempscollision2(distance1[j], distance2[j], decal);
     
    			}
    			this.distancemin1=this.distanceminimale();
     
    			}
    			catch(InterruptedException e){};
    		}
    je ne sais pas comment utiliser le join() pour résoudre le problème
    merci d'avance pour l'aide.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    moi j'ai pas trop compris, c'est quoi ton soucis? Pourquoi démarrer un thread séparé (monthread) et attendre sa fain plutot que d'exécuter le code dans le thread courant directement? T'essaie de faire quoi au juste?

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 172
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    moi j'ai pas trop compris, c'est quoi ton soucis? Pourquoi démarrer un thread séparé (monthread) et attendre sa fain plutot que d'exécuter le code dans le thread courant directement? T'essaie de faire quoi au juste?
    oui je suis entrain de programme un agent mobile, performbehavio() est un thread qui doit être exécuter sans arrêt c le thread qui permet l'agent de se déplacer sans arrêt, tandis que le thread monthread() et run() permet de faire le calcul des capteurs puis se met en attente puis reprend le calcul afin de faire une comparaison entre les informations avant et après.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Quelle genre de synchronisation tu veux entre les deux? Puisque le premier thread ne peux pas attendre le deuxième, c'est un peu cuit pour espérer attendre ses résultat. C'est pas parce qu'on ne peux pas l'attendre que magiquement il va s'exécuter plus vite :/

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 172
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Quelle genre de synchronisation tu veux entre les deux? Puisque le premier thread ne peux pas attendre le deuxième, c'est un peu cuit pour espérer attendre ses résultat. C'est pas parce qu'on ne peux pas l'attendre que magiquement il va s'exécuter plus vite :/
    oui, en faite la méthode performbehavio() doit s'exécuter séparément de la méthode control(), mais puisque je veux créer ++ agents qui naviguent en meme temps alors j'ai mis le code de la méthode control() {qui se charge de faire le calcul} dans la méthode performbehavio() { qui se charge de laisser l'agent en mouvement sans arrêt}
    pour cala il y a un problème et le programme se bloque

Discussions similaires

  1. Comment fusionner deux flux qui n'ont pas le meme shéma
    Par zerocoolyoussef dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 20/03/2009, 18h35
  2. copier le contenu de deux tables qui n'ont pas la meme BDD
    Par kroma23 dans le forum Bases de données
    Réponses: 7
    Dernier message: 24/02/2009, 21h03
  3. comparer des variables qui n'ont pas le même attribut
    Par stagolee dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/02/2008, 11h14
  4. Réponses: 3
    Dernier message: 21/11/2006, 18h26
  5. Communication entre deux fenetres qui n'ont pas de lien de parenté
    Par Invité dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/09/2006, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo