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

Concurrence et multi-thread Java Discussion :

Probleme de concurrence avec les THREADS


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre actif Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Points : 209
    Points
    209
    Par défaut Probleme de concurrence avec les THREADS
    Bonjour,

    j'ai un probleme.

    J'ai construit un graphe où chaque noeud est composé d'un thread.
    Quand un thread est appelé il execute son code interne et ensuite trouve les thread qui le suive dans le graphe. Il ecrit dans un tampon le nom du thread qui le suit, ainsi l'enseble des thread cherche dans le tampon leur nom pour pouvoir s'executer.
    ça marche bien jusqu'au moment où un thread est appelé pour la seconde fois, dans ce cas la il ne trouve pas ses éléments suivants. Je ne vois pas du tout d'ou peut venir ce probleme.
    Si quelqun peut m'aider voici le code:

    le run d'un 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
    public void run()
    	{
    		try
    		{
    			int r = (int)(Math.random() * 100);
    			System.out.println("r = "+r);
    			sleep(r);
    		}
    		catch(InterruptedException e)
    		{
    			e.printStackTrace();
    		}
    		while(true)
    		{
     
    			//System.out.println(nomproc);
    			boolean rg = grp.lireCommunicationExterne(nomproc);/*ca va retourner une liste*/
     
    			if(rg)
    			{
     
    				niveau2++;
    				for(int i = 0 ; i < niveau2 ; i++)System.out.print(" ");
    				System.out.println("on est dans le processus "+nomproc);
    				//communicationInterne(initial);
    				grp.ecrireCommunicationExterne(nomproc);/*ecrit les suivant dans le tampon...*/
    			}
    		}
     
    	}
    et les fonctions synchonized:
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    public synchronized void ecrireCommunicationExterne(String nom)
    	{//System.out.println("tintamarre = " + available);
    		while(available == true)
    		{
    			try
    			{
    				wait();
    			}
    			catch(InterruptedException e)
    			{
    				e.printStackTrace();
    			}
    		}
    			/*on écrit les suivants*
    			 */
    		//System.out.println("tintamarre");
     
    			ArrayList suiv = rechercheSuivant(nom);
    			System.out.print("les suivants sont ");
    			for(int i = 0 ; i< suiv.size() ; i++)
    			{
    				int j = Integer.parseInt((String)suiv.get(i));
    				tampon[i] = (String)tableid.get(j);
    				System.out.println(tampon[i]);
    			}
    			available = true;
    			notifyAll();
     
    	}
     
    	public synchronized boolean lireCommunicationExterne(String mot)
    	{
    		while(available == false)
    		{
    			try
    			{
    				wait();
    			}
    			catch(InterruptedException e)
    			{
    				e.printStackTrace();
    			}
    		}
    			available = false;
    			notifyAll();
    			for (int i = 0 ; i < tampon.length ; i++)
    			{
    				//System.out.println("tampon[i] = "+tampon[i]+" mot = "+mot);
    				if(tampon[i]!= null && tampon[i].equals(mot))
    				{
    					//tampon[i]= null;
    					tampon = new String[100];
    					return true;
    				}
    			}
    			available = true;
    			return false;
     
     
    	}

  2. #2
    Membre actif Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Points : 209
    Points
    209
    Par défaut
    en fait je voi d'ou vien le probleme mais je ne le comprend pas et cela n'a rien avoir avec les threads en fait...

    je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ArrayList liste = new ArrayList();
    					liste = (ArrayList)graphe.get(ident);
    					System.out.println("liste = "+liste);
    					liste.remove(0);
    Hors j'ai l'impression que quand je fais un liste.remove(0) cela supprime aussi dans l'arraylist graphe!! est ce qu c'est normal? qu'est ce que je dois faire pour éviter cela?

    merci

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par L4BiN
    Hors j'ai l'impression que quand je fais un liste.remove(0) cela supprime aussi dans l'arraylist graphe!! est ce qu c'est normal?
    Oui c'est tout à fait normal puisqu'en Java l'opérateur = ne crée pas une copie de l'objet mais une copie de la référence.

    Donc liste et graphe.get(ident) correspond au même objet ! Si tu modifies l'un tu modifies "les deux"...

    Au passage le new ArrayList() est complètement inutile car l'objet est "détruit" à la ligne suivante...

    Citation Envoyé par L4BiN
    qu'est ce que je dois faire pour éviter cela?
    Créer toi même une copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList liste = new ArrayList( (Collection)graphe.get(ident) );
    A noter que cela ne copie que la liste et pas le contenu. Donc les ajout/suppression de la liste n'auront aucun impact sur l'autre liste, mais la modification des objets de la liste impactera également l'autre liste...

    a++

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

Discussions similaires

  1. SDL/Opengl : Probleme de texture avec les thread
    Par tektotodu96 dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/04/2011, 01h42
  2. Probleme avec les Threads
    Par ouxss dans le forum C++
    Réponses: 2
    Dernier message: 05/01/2010, 10h27
  3. Probleme avec les threads
    Par Loenix dans le forum Général Python
    Réponses: 4
    Dernier message: 04/06/2009, 14h50
  4. Probleme avec les thread
    Par jonny dans le forum MFC
    Réponses: 11
    Dernier message: 01/06/2006, 17h37
  5. Probleme avec les threads
    Par Orahn dans le forum MFC
    Réponses: 5
    Dernier message: 04/11/2005, 10h14

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