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 :

problème de synchronisation


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 problème de synchronisation
    bonsoir, j'ai un problème lors de synchronisation, vue que mon code est très compliqué, j'ai essayée de transfèrer ma problématique à travers un simple exemple compréhensible.
    voici l'exemple:
    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
    40
    41
    42
    43
    44
    45
    public class tictac implements Runnable {
       int x,y;
       public void run() {
           int a=2; int b=4;
         
           x=a+b;
           try{Thread.sleep(1000);
           y=b-a+x;
           }
           catch (InterruptedException e){};
    	  
       }
       public tictac(){
    	   
       }
       public void affiche(){
    	  
     Thread th=new Thread(this);
    	   th.start();
    	   try {
    			th.join();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
      System.out.println("bonjour");
    
    	   int somme=(x+y);
    	   System.out.println("la somme est "+somme);
    	  double x=Double.POSITIVE_INFINITY;
    	   System.out.println("l'infinie est"+ x);
    	   
       }
    	
    	
    	
    	public static void main(String argv[]) {
           //ThreadTest tic = new ThreadTest("TIC");
            //ThreadTest tac = new ThreadTest("TAC");
    		tictac a=new tictac();
    		
    		a.affiche();
        }
    	
    }
    j'ai besoin à t=1 de calculer x puis le programme se met en attente (ce qui est en bleu) jusqu'à ce que le thread calcule la valeur de y
    mais en appliquant ce code l'instruction en rouge elle même se met en attente du thread jusqu'à ce dernier termine l'exécution de ces instructions, ma problématique est comment puisse je exécuter l'instruction en rouge en parallèle avec le thread et l'instruction en bleu après le thread
    j'ai reflèchie à introduire notion de priorité des instructions à exécuter par exemple donner à l'instruction enrouge une priorité élevé d'une façon elle s'exécuter sans arrêt, mais comment le faire en plus je ne sais pas si ça existe en java ou bien nn.
    bon peut être y t'il qlq qui a une autre solution plus simple et claire.
    merci d'avance pour l'aide

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Rien compris à ton problème.
    Fais des phrases simples et courtes pour exposer correctement la problématique
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  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
    Citation Envoyé par dinobogan Voir le message
    Rien compris à ton problème.
    Fais des phrases simples et courtes pour exposer correctement la problématique
    bonjour
    d'accords, mon problème est comme suit:
    *j'ai besoin à t=1 de calculer la valeur de x puis à t=2 calculer la valeur de y
    *après t=2 j'ai besoin que mon programme exécute l'instruction en bleu (calculer x+y), donc pendant que le thread est en attente il faut que les instructions en bleu ne s'exécute pas (elle même se mettent en attente jusqu'à ce que le thread termine l'exécution de ses instructions) sinon résultat erroné.
    *sauf l'instruction en rouge, je veux qu'elle s'exécute en parallèle avec le thread, càd, je veux qu'elle s'exécute avant le thread, pendant que le thread en attente et après que le thread termine les instructions. donc je veux qu'aucune instruction interrompe l'exécution de l'instruction en rouge.
    *mais en appliquant ce code l'instruction en rouge elle même se met en attente du thread jusqu'à ce dernier termine l'exécution de ces instructions, --->ma problématique est comment puisse je exécuter l'instruction en rouge en parallèle avec le thread et l'instruction en bleu après le thread
    j'ai réfléchie à introduire notion de priorité des instructions à exécuter par exemple donner à l'instruction en rouge une priorité élevé d'une façon elle s'exécuter sans arrêt, mais comment le faire en plus je ne sais pas si ça existe en java ou bien nn.
    j'espère bien c'est claire mnt
    je souhaite avoir une idée ou solution.
    merci d'avance pour l'aide

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 121
    Points
    121
    Par défaut
    Pour repondre a ta problematique

    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
    40
    41
    42
     
    public class tictac implements Runnable {
    	int x, y;
     
    	public void run() {
    		int a = 2;
    		int b = 4;
     
    		x = a + b;
    		try {
    			Thread.sleep(1000);
    			y = b - a + x;
    		} catch (InterruptedException e) {
    		}
    		;
     
    	}
     
    	public void affiche() {
     
    		Thread th = new Thread(this);
    		th.start();
    		System.out.println("bonjour");
    		try {
    			th.join();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		int somme = (x + y);
    		System.out.println("la somme est " + somme);
    		double x = Double.POSITIVE_INFINITY;
    		System.out.println("l'infinie est" + x);
     
    	}
     
    	public static void main(String argv[]) {
    		new tictac().affiche();
    	}
     
    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 121
    Points
    121
    Par défaut
    Lorsque tu fais le "th.start()", le thread est execute mais le programme recupere la main donc le println sera effectue.

    Ensuite, le "th.join()" permet d'attendre la fin de lexecution de ton thread pour pouvoir ensuite executer les autres instructions

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 121
    Points
    121
    Par défaut
    Au fait, pourquoi attendre 1 seconde entre le calcul de x et celui de y ?

  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 radtriste Voir le message
    Lorsque tu fais le "th.start()", le thread est execute mais le programme recupere la main donc le println sera effectue.

    Ensuite, le "th.join()" permet d'attendre la fin de lexecution de ton thread pour pouvoir ensuite executer les autres instructions
    merci d'avance, mais ça ne résoudre pas le problème, car après que le thread termine l'exécution l'affichage du mot bonjour ne se fait pas, tandis que moi je veux que cette instruction s'exécute avant, en parallèle et après le thread.
    oui je sais que c'est inutile d'utiliser thread pour calculer le y (attendre 1s pour calculer y), mais mon vrai code est trop compliquée pour cela j'ai essayée de transférer ma problématique avec un petit exemple claire et compréhensible par tous le monde afin de trouver une solution que je puisse l'appliquer dans mon code.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 121
    Points
    121
    Par défaut
    Si tu veux quelle saffiche pendant et apres, il faut que tu la mette dans le thread et apres lattente de fin d'execution du thread, dans ce genre la :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    public class tictac implements Runnable {
    	int x, y;
     
    	public void run() 
    	{
    		int a = 2;
    		int b = 4;
     
    		x = a + b;
    		
    		printBonjour();
    		try {
    			Thread.sleep(1000);
    			y = b - a + x;
    		} catch (InterruptedException e) {
    		}
    		;
     
    	}
     
    	public void affiche() 
    	{
     		Thread th = new Thread(this);
    		th.start();
    		printBonjour();
    		try {
    			th.join();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		printBonjour();
    		int somme = (x + y);
    		System.out.println("la somme est " + somme);
    		double x = Double.POSITIVE_INFINITY;
    		System.out.println("l'infinie est" + x);
     
    	}
    	
    	private void printBonjour()
    	{
    		System.out.println("bonjour");
    	}
     
    	public static void main(String argv[]) {
    		new tictac().affiche();
    	}
     
    }

  9. #9
    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
    merci en toute, vous êtes très gentil, mais c'est pas ce que je cherche mais je vais donner un exemple très simple :
    on suppose je suis entrain de conduire ma voiture réellement la vitesse de ma voiture est différente de zéro, supposant à t=1 mon amie m'appelle sur mon téléphone pour demander de l'aide, je lui demande d'attendre 1 seconde pour que je réfléchie, et après une seconde je lui envoie la solution, et je poursuit mon chemin, réellement en communiquant avec mon amie j'ai pas arrêtée ma voiture (la vitesse reste tjr différente de zéro)
    donc voici un exemple qui s'approche de ma problématique.
    j'ai besoin qu'une instruction reste tjr exécutable (elle ne s'arrête pas) même si il y a un thread, et il y a d'autres instructions qui dépendent de thread vont être exécuter que lorsque ce dernier termine l'exécution de ses instructions.
    j'espère mnt la problématique est est claire mais la solution est compliquée j'arrive pas à trouve une solution déjà je suis bloquée depuis deux jours.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par oumay Voir le message
    merci en toute, vous êtes très gentil, mais c'est pas ce que je cherche mais je vais donner un exemple très simple :
    on suppose je suis entrain de conduire ma voiture réellement la vitesse de ma voiture est différente de zéro, supposant à t=1 mon amie m'appelle sur mon téléphone pour demander de l'aide, je lui demande d'attendre 1 seconde pour que je réfléchie, et après une seconde je lui envoie la solution, et je poursuit mon chemin, réellement en communiquant avec mon amie j'ai pas arrêtée ma voiture (la vitesse reste tjr différente de zéro)
    donc voici un exemple qui s'approche de ma problématique.
    j'ai besoin qu'une instruction reste tjr exécutable (elle ne s'arrête pas) même si il y a un thread, et il y a d'autres instructions qui dépendent de thread vont être exécuter que lorsque ce dernier termine l'exécution de ses instructions.
    j'espère mnt la problématique est est claire mais la solution est compliquée j'arrive pas à trouve une solution déjà je suis bloquée depuis deux jours.
    Dans ce que tu me dis, considere que la conduite de la voiture c'est le processus principal et que l'appel au telephone, c'est un thread.

    Si j'ai bien compris, au final, tu veux pouvoir "dire bonjour" pendant qu'il effectue les calculs ?

    sa donnerait cela :
    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
    40
    41
    42
    43
    44
     
    public class tictac implements Runnable {
    	int x, y;
     
    	public void run() 
    	{
    		int a = 2;
    		int b = 4;
     
    		x = a + b;
     
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    		}
     
    		y = b - a + x;
     
    		int somme = (x + y);
    		System.out.println("la somme est " + somme);
    	}
     
    	public void affiche() 
    	{
     		Thread th = new Thread(this);
    		th.start();
     
    		while(th.isAlive())
    			printBonjour();
     
    		double x = Double.POSITIVE_INFINITY;
    		System.out.println("l'infinie est" + x);
    	}
     
    	private void printBonjour()
    	{
    		System.out.println("bonjour");
    	}
     
    	public static void main(String argv[]) {
    		new tictac().affiche();
    	}
     
    }
    Par contre, attends toi a ce qu'il affiche beaucoup de bonjour

  11. #11
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    j'ai pas bien suivi le fil donc une idée en l'air: créer un PipedStream. Un thread ecrit et continue sa route et l'autre est bloqué en lecture jusqu'à ce qu'il recoive le message (et fait ce qu'il veut ensuite). non?
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Ou alors avec une simple synchronisation à base de wait, notify.

  13. #13
    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 radtriste Voir le message
    Dans ce que tu me dis, considere que la conduite de la voiture c'est le processus principal et que l'appel au telephone, c'est un thread.

    Si j'ai bien compris, au final, tu veux pouvoir "dire bonjour" pendant qu'il effectue les calculs ?

    sa donnerait cela :
    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
    40
    41
    42
    43
    44
     
    public class tictac implements Runnable {
    	int x, y;
     
    	public void run() 
    	{
    		int a = 2;
    		int b = 4;
     
    		x = a + b;
     
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    		}
     
    		y = b - a + x;
     
    		int somme = (x + y);
    		System.out.println("la somme est " + somme);
    	}
     
    	public void affiche() 
    	{
     		Thread th = new Thread(this);
    		th.start();
     
    		while(th.isAlive())
    			printBonjour();
     
    		double x = Double.POSITIVE_INFINITY;
    		System.out.println("l'infinie est" + x);
    	}
     
    	private void printBonjour()
    	{
    		System.out.println("bonjour");
    	}
     
    	public static void main(String argv[]) {
    		new tictac().affiche();
    	}
     
    }
    Par contre, attends toi a ce qu'il affiche beaucoup de bonjour
    bonjour, merci d'avance pour votre aide, pour while(th.isAlive())
    printBonjour();
    sa marche bien dans ce cas mais je en sais pas pourquoi ça ne marche pas bien pour mon problème, bon réellement mon problème comme déjà dis une voiture qui ne doit pas s'arrêter, j'ai réfléchie de séparer les instructions en deux threads : une qui s'exécute sans arrêt (la vitesse) et l'autre s'exécute dés qu'il y a appel )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de synchronisation de thread
    Par youp_db dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 11/10/2006, 11h34
  2. [VB.net] Problème de synchronisation d'une base
    Par WriteLN dans le forum Windows Forms
    Réponses: 18
    Dernier message: 21/10/2005, 13h11
  3. Problème de synchronisation...
    Par sankookai dans le forum MFC
    Réponses: 10
    Dernier message: 16/02/2005, 14h03
  4. [C#] Problème de synchronisation de combobox
    Par WwiloO dans le forum Windows Forms
    Réponses: 3
    Dernier message: 20/12/2004, 19h56
  5. Problème de synchronisation dans un JTextArea
    Par wutang dans le forum Composants
    Réponses: 3
    Dernier message: 21/06/2004, 15h06

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