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 :

Comment partager les ressources entre 2 threads?


Sujet :

Concurrence et multi-thread Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Comment partager les ressources entre 2 threads?
    Je souhaite creer 2 threads. Un affiche une valeur et l'autre l'incrémente.
    Seulement je veux qu'a chaque boucle la valeur prise soit la valeur actuelle et pas la valeur passée en paramètre à l'appel des threads au début.

    j'ai écrit le programme suivant qui fait tourner 2 threads. Chacun travaille indépendemment. Pouvez vous me dire les modifications à apporter pour qu'il y ait un partage de ressources merci

    thread1:
    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 class classe1 implements Runnable{
     
    public void run(){		
     
    		int valeur;
     
    		for(;;)
    			{
     
    			System.out.println("thread1: " + valeur);
    			valeur ++;
             try{Thread.sleep (5000);}
    			catch (InterruptedException e) { }
     
    			}	
    		}
    thread2:
    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
     
     
    public class classe2 implements Runnable{
     
         public void run(){
     
    	int valeur = 0;
     
    	for(;;)
    		{
          Conversation.append("\n" + " thread2: " + valeur);
          try{Thread.sleep (5000);}
    		catch (InterruptedException e) { }
    		}	
    	}
    et le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static void main(String[] args) throws IOException {
     
                   classe1 c1= new classe1();
                   classe2 c2 = new classe2();
                   new Thread(c1).start();
                   new Thread(c2).start();
                   }
    il me faudrait surement un main du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void main(String[] args) throws IOException {
     
                   int valeur = 0;
                   classe1 c1= new classe1(valeur);
                   classe2 c2 = new classe2(valeur);
                   new Thread(c1).start();
                   new Thread(c2).start();
                   }
    mais je n'arrive pas à passer de paramètre à la méthode run et je ne sais pas comment faire pour qu'à chaque boucle, la valeur prise soit celle qui circule entre les threads et pas celle de départ.
    Si cela marche il y a t-il des risques de conflits à l'accès. g vu dans des cours sur le net l'emploi de Synchronized. Comment vérouiller l'acces pour que lorsque le thread 1 incrémente la valeur, le thread2 n'essaye pas d'afficher. merci de vos réponses.

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Les types primitifs sont passes par valeur. Passe donc un Integer a tes threads, il sera passe par reference et sera partage entre les deux threads. Pour les acces concurrents, il y a plein de solutions, dont les blocs synchronized. Tu peux aussi regarder le package java.util.concurrent si tu utilises Java 1.5.
    Romain Guy
    Android - Mon livre - Mon blog

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Si il y a un thread qui lit et surtout un seul thread qui écrit, il me semble qu'il ne peut pas y avoir de soucis d'accés concurent, je dis une bétise :

  4. #4
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Le seul danger est que tu puisses lire une valeur non a jour du point de vue du thread qui ecrit. Tu pourrais par exemple voir dans la console deux fois de suite le meme nombre. Ca depend de ce qu'on veut faire.
    Romain Guy
    Android - Mon livre - Mon blog

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 34
    Points : 35
    Points
    35
    Par défaut
    Slt
    Non se shema ne fonctionne pas du tout (.......si je ne m'abuse.!)
    il faut que les deux thread soient "a l'ecoute" d'un meme troisieme objet une autre classe
    le premier thread passe une valeur a cette troisieme classe qui notifie le deuxieme thread qu'elle vient de recevoir une nouvelle valeur , cette valeur une fois retire , libere le lock, et donne au thread 1 la possibilitee d'en donner une nouvelle, et ainsi vas la vie........
    (si je ne m'abuse............!)
    De plus si au lieux de metre implement Runnable tu met extend Thread
    pour faire tourner tout sa tu devrais avoir quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public static void main(String[] args) { 
                   LaFameuseTroisiemeClasse lftc = new LaFameuseTroisiemeClasse();  
                   classe1 c1= new classe1(lftc); 
                   classe2 c2 = new classe2(lftc); 
                   c1.start(); 
                   c2.start(); 
                   }

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Il faut evidemment partager la valeur et le verrou entre les deux threads. Mais tu n'as pas besoin de faire ca par notification, tu peux le faire par attente active (un verrou donc).
    Romain Guy
    Android - Mon livre - Mon blog

  7. #7
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Citation Envoyé par gailuris
    Si il y a un thread qui lit et surtout un seul thread qui écrit, il me semble qu'il ne peut pas y avoir de soucis d'accés concurent, je dis une bétise :
    Oui

    Il peut par exemple y avoir des problèmes si un thread supprime un élément d'une List alors qu'un autre est en train de la lire / parcourir.

    De plus, la synchronisation permet de s'assurer que la variable avec laquelle travaille le thread est bien synchro avec la mémoire principale (ainsi que l'a dit Gfx, voir plus de détails là: http://java.sun.com/docs/books/vmspec/2nd-edition/html/Threads.doc.html)
    Glob
    What would you do if you were not afraid?

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Oui vous avez raison je n'avais pensé qu'à des cas (trop ?) simple...

Discussions similaires

  1. Réponses: 14
    Dernier message: 11/07/2008, 13h09
  2. Réponses: 1
    Dernier message: 14/04/2008, 16h49
  3. Réponses: 11
    Dernier message: 22/10/2007, 16h06
  4. [WinForms]Comment partager des objets entre threads ?
    Par AiSpirit dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 16/08/2006, 08h57
  5. [javaBean + JSP] comment partager un objet entre les page JSP
    Par subzero82 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 31/05/2006, 18h48

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