Comment synchroniser deux thread qui n'ont pas le même temps d'attente

cs_maymouta Messages postés 12 Date d'inscription mercredi 3 février 2010 Statut Membre Dernière intervention 27 mai 2011 - 18 sept. 2010 à 13:03
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 - 20 sept. 2010 à 16:31
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 ?
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()
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
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){};
}

j'attends vos réponses
et merci d'avance pour l'aide.

3 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
20 sept. 2010 à 11:59
Salut,

J'aimerais bien t'aider sur ce sujet qui n'a plus trop de secret pour moi.
Cependant, à mon avis, tes explications ne sont pas très claires. J'ai du mal à te comprendre et il y a trop de code qui pollue ta problématique principale. En plus c'est lundi matin...


Peux-tu formuler ça de manière plus synthétique stp, sous forme de pseudo-langage par exemple, juste histoire qu'on comprenne exactement ton souci?
0
cs_maymouta Messages postés 12 Date d'inscription mercredi 3 février 2010 Statut Membre Dernière intervention 27 mai 2011
20 sept. 2010 à 15:56
primo merci pour l'intérêt que vous avez donner à mon problème
je vais mieux expliquer ma problématique
j'ai une fonction qui s'appelle performbehavior, est est automatiquement appelé chaque 0.05 second pour exécuter des instructions.
est j'ai une autre fonction qui s'appelle control(), cette fonction fait appelle à un thread qui se met en attente pendant 0.4 second
ainsi la structure de code est comme suit
public class monthread extends Thread (){
    public void run(){
   
    // instruction
try {
// pause
 Thread.sleep(400);
}
 catch (InterruptedException ex) {}
}

}


public void performbehavior(){
// instruction 
this.control();
}

public void control(){

monthread m= new monthread();
m.start();

//instructions
}


le problème est comme suit : performbihavior est une méthode qui s'éxecte automatiquement après chaque 0.05 second, mais elle fait appel à une méthode qui s'appelle control(), celle ci fait appel à un thread qui se met en attente pendant 0.4 second, donc la méthode performbihavior va se bloquer car elle doit reprendre l'exécution de ses instructions (l'appel de control() ) après 0.05 tandis que la méthode control() est en attente de 0.4 second.
j'espère mnt le problème est claire.
merci d'avance pour l'aide.
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
20 sept. 2010 à 16:31
je ne suis pas sûr d'avoir bien compris, mais si tu fais :

th.join()

c'est une instruction bloquante, donc forcément tu attends la fin de l'exécution du thread "monthread" avant de poursuivre la méthode control()

pourquoi n'enlèves-tu pas cette instruction join() ?
0
Rejoignez-nous