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 :

Partager des variables entre Threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Partager des variables entre Threads
    Bonjour,

    j'essaye de faire du multithreading en traitement d'images.
    J'utilise pour l'instant ce type de code :
    Code java : 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
     
    public Image Dilatation(Image ImageATraiter)
    	{
    	final int var1 ;
    	...
    	Thread T1 = new Thread()
    		{
    		public void run()
    			{
    			//Traitement de la moitié de l'image... en utilisant var1
    			}
    		}
     
    	Thread T2 = new Thread()
    		{
    		public void run()
    			{
    			//Traitement de l'autre moitié de l'image... en utilisant var2
    			}
    		}
     
    	T1.join() ;
    	T2.join() ;
    	...
    	return ImageResultat ;
    	}

    Pour que mes deux threads puissent utiliser var1, je dois la déclarer en dehors ET de mettre 'final'. Ceci me chagrine un peu car j'aurai par la suite des variables dont je souhaiterai modifier les valeurs par les threads.

    Je sais que sinon je pourrais déclarer une fonction qui étends la classe Thread, à laquelle je passerai les bornes de traitement (les deux moitiés de mon image) et qu'il me suffirait d'appeler deux fois. Mais je préférerai éviter cela.

    Comment puis résoudre ce problème ?

    Merci par avance

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,

    Tu peux t'en sortir en déclarant tes variables en membre de ta classe plutôt qu'en variable locale.
    Si c'est ce que tu fais, documente-toi sur le mot-clé volatile, il pourrait t'être utile...

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Si c'est ce que tu fais, documente-toi sur le mot-clé volatile, il pourrait t'être utile...
    C'est fait, merci... mais ce mot clé semble très fortement déconseillé et surtout pas géré par toutes les JVMs.

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Si tu décides de t'en passer, soit tu acceptes le fait de pourvoir lire une valeur obsolète, soit tu mets en place un système qui te garantit la synchronisation.

    Le tout est de bien connaître les risques.

  5. #5
    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
    Citation Envoyé par ToTo13 Voir le message
    C'est fait, merci... mais ce mot clé semble très fortement déconseillé et surtout pas géré par toutes les JVMs.
    ah bon?
    la spec de 1.5 a mis au point la sémantique de volatile (qui n'était pas claire avant). Elle concerne deux aspects:
    - la validité d'une donnée au regard des copies qu'un thread fait de la mémoire principale
    - l'interdiction faite de réordonnancer des instructions élémentaires au travers de la "barrière" ainsi créée.

    Il y aurait des JVM (post 1.5) non conformes aux specs?
    pourquoi fortement déconseillé? il me semble que ça a un sens suffisament ciblé (bien sûr si c'est pas ça qu'on cherche .... par exemple on n'a pas d'atomicité -même sur une opération comme l'incrémentation-)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    dans ton cas, je recommanderais plutot de réorganiser un peu le code pour éviter ces problèmes.

    1) Faire des tes annonymous inner class des simples inner classe avec un nom, ainsi tu pourra leur mettre un constructeur qui recois les données.

    2) Pour toutes les données que devront s'échanger les Thread en question, mettre ces donnée dans une classe Data, avec éventuellement le mot clé volatile devant comme déjà expliqué, et passer cette instance de Data aux deux Thread.

    Ca ressemblreais à ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public class ThreadCalcul extends Thread{
        // ....
        public ThreadCalcul(Data data) {.....}
        // ....
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Date {
         public volatile int uneDonnee;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public Image Dilatation(Image ImageATraiter){
        Data data = new Data();
        data.uneDonnee = ....;
        Thread t1 = new ThreadCalcul(data);
        Thread t2 = new ThreadCalcul(data);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }

  7. #7
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Merci, c'est justement ce que je suis en train de tester ;-)

  8. #8
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    mon dernière réponse dans cette discussion montre le choix d'architecture que j'ai choisi, car ça réponds à tous les problèmes que j'avais.

    Merci...

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

Discussions similaires

  1. "Partager" des variables entre différents fichiers
    Par clairetj dans le forum Langage
    Réponses: 8
    Dernier message: 04/02/2014, 11h04
  2. Réponses: 4
    Dernier message: 02/11/2011, 09h43
  3. vb.net : Partage des variables entre forms
    Par House MD dans le forum VB.NET
    Réponses: 5
    Dernier message: 13/03/2008, 22h46
  4. Partager des variables entre plusieurs actions ds un controlleur
    Par gvdmoort dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 11/10/2007, 09h38
  5. [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

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