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 :

Anonymous classes, variable final et concurrence entre threads.


Sujet :

Concurrence et multi-thread Java

  1. #1
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut Anonymous classes, variable final et concurrence entre threads.
    Bonjour à tous,

    je viens à vous pour une petite question à propos du mot clef final:

    J'ai plusieurs threads qui peuvent s'échanger des événements au moyen de listeners.

    Petit exemple de code avec ici l'utilisation d'un Timer (mais je désirerais une réponse la plus générale possible):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public synchonrized void maFonction(int maVariable) {
     
        final maVariableFinal = maVariable;
     
        javax.swing.Timer timer = new javax.swing.Timer( 
            GROS_DELAI, 
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println(maVariable);
                }
            }
        );
    }
    Voilà l'idée.

    1/ Au temp T On a donc un thread 'x' qui appelle maFonction qui va lancer un événement qui se produira dans un autre thread (ici, l'EDT) beaucoup, beaucoup plus tard.

    2/ d'ici à temp (T + GROS_DELAI), il est fort probable que maFonction() soit appelée par plein d'autres threads (y compris des threads qui veulent l'appeler en même temps), et avec plein de valeurs différentes pour maVariable.

    3/ Lorsque viendra le temps T + GROS_DELAI, je voudrais être sûr que l'action sera bien exécutée avec la bonne valeur pour maVariable, ainsi que tous les autres appels des autres threads.

    D'où ma question : mon code ci-dessus est-il suffisant, ou je risque d'être confronté à des soucis de concurrence (ou autre) ?

    Merci d'avance pour vos conseils avisés

  2. #2
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Une variable int ne peut pas être modifiée, donc ton code va fonctionner.
    Sauf que c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final int maVariableFinal = maVariable;

  3. #3
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Tout d'abord merci pour ta réponse.
    Effectivement, il y avait une petite typo dans le code ci-dessus. Je l'ai tapé (un peu trop vite) en direct sur le forum.

    J'avais bien compris le principe des variables 'final', mais je m'interrogeais surtout sur leur portée.

    Je viens du C++ et le pseudo équivalent en C++ est le mot clef 'const'. Or une variable const en C++ dans le même cas est détruite dès la sortie de la fonction, d'où ma question.

    Maintenant, si on considère que l'équivalent en C++ est un pointeur const, je comprends mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // équivalent en C++ (?)
    const int* maVariableconst = new int(maVariable);
    Là on a bien une variable dont la portée dépasse celle de la fonction et c'est le pointeur sur cette variable qui sera passée en paramètre à mon inner class.

    C'est bien ça ?

    Y aurait-t-il d'autres points qu'il serait bon de connaître pour ce genre de problématique ?

    Merci en tout cas

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    En fait, le compilateur traduit plus ou moins le code d'une classe anonyme par le code suivant :
    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
    public synchronized void maFonction(int maVariable) {
     
        javax.swing.Timer timer = new javax.swing.Timer( 
            GROS_DELAI, 
            new Anonymous(maVariable)
        );
    }
     
    private class Anonymous implements ActionListener {
      private int variable;
      public Anonymous(int variable) {
        this.variable = variable;
      }
     
       public void actionPerformed(ActionEvent e) {
           System.out.println(variable);
       }  
    }

  5. #5
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Ok, c'est bien ce qui me semblait et ce que j'avais pu constater avec quelques tests grosso modo.

    Je préférais que quelqu'un puisse me confirmer.


    C'est chose faite.

    Merci BEAUCOUP à vous deux

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

Discussions similaires

  1. classe anonyme et paramétre final
    Par natoine dans le forum Langage
    Réponses: 38
    Dernier message: 08/10/2013, 10h52
  2. Thread - classes - Variables
    Par electro74 dans le forum C#
    Réponses: 10
    Dernier message: 04/08/2010, 13h50
  3. Partager des variables entre Threads
    Par ToTo13 dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 01/04/2010, 16h09
  4. Réponses: 4
    Dernier message: 02/10/2009, 09h23
  5. partage de variables globlales entre threads
    Par ikuzar dans le forum Débuter
    Réponses: 7
    Dernier message: 02/09/2009, 15h43

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