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 :

Thread et classe interieur


Sujet :

avec Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 277
    Points : 64
    Points
    64
    Par défaut Thread et classe interieur
    Bonsoir,

    J'ai trouvé ici-même 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
    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
    61
    62
     
    /*
     * Created on 8 juil. 2004
     *
     */
    package tutorialthread.examples.sync;
     
    import java.util.Random;
     
    /**
     * @author Valère VIANDIER
     *
     */
    public class VaseComuniquant {
        private static final int QUANTITE_INITIALE = 200;
        private static final int NB_THREAD_MAX = 2;
     
        private static int iteration = 0;
     
        private int[] vase = {QUANTITE_INITIALE / 2,QUANTITE_INITIALE / 2};
     
        public VaseComuniquant() {
            for( int i = 0; i < NB_THREAD_MAX; i++)
                new ThreadTransfert().start();
        }
        public static void main(String[] args) {
            new VaseComuniquant();
        }
     
        public int transfert(int qte) {
            // Ne pas enlever les System.out de ce test !
            System.out.print("-("+qte+") dans le vase 1 ");
            vase[0] -= qte;
            System.out.println("+("+qte+") dans le vase 2");
            vase[1] += qte;
            iteration++;
            if( iteration % 1000 == 0)
                System.out.println("" + iteration + " itérations.");
            return vase[0]+vase[1];
        }
     
        public class ThreadTransfert extends Thread {
            Random r = new Random();
            int quantite;
            public void run() {
                while( !isInterrupted()) {
                    quantite = r.nextInt(11)-6;
                    vase[0] -= quantite;
                    vase[1] += quantite;
                    if( transfert(quantite) != QUANTITE_INITIALE) {
                        System.err.println("Quantité totale invalide à l'itération " + iteration);
                        System.exit(-1);
                    }
     
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {}
                }
            }
     
        }
    }
    Le fait d'insérer la définition d'une classe dans une autre me pose un problème conceptuel.

    Comment aurait-on pu faire en écrivant une classe "ThreadTransfert " a l'extérieur de la classe "VaseComuniquant " ? En particulier comment permette à la classe "ThreadTransfert" d'accéder aux tableaux vase[0] et vase[1] alors qu'ils sont dans l'objet "VaseComuniquant " ? avec des getteur et des seteurs ?

    Comprenez vous ma question ?

    Merci de toute explication.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 565
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Citation Envoyé par Jolt0x Voir le message
    avec des getteur et des seteurs ?
    Ma foi oui, c'est l'état de l'art.

    Mais sinon il y avait aussi l'approche toute simple :

    vaseCommuniquant.vase[0]
    et
    vaseCommuniquant.vase[1]

  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 thelvin Voir le message
    Ma foi oui, c'est l'état de l'art.
    C'est d'ailleurs ce que fait le compilateur.

    En fait le compilateur génère une classe avec un constructeur prenant en paramètre la classe "conteneur" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class ThreadTransfert extends Thread {
     
        private final VaseComuniquant outer;
     
        public ThreadTransfert(VaseComuniquant outer) {
            this.outer = outer;
        }
        ...
    Mais une telle classe ne peut pas accéder aux variables "private". Du coup le compilateur va générer des méthodes getter()/setter() en visibilité "package" selon le besoin, afin de pouvoir accéder à ces champs.

    On peut voir cela facilement en décompilation la classe (javap -c) ou via l'API de reflection...



    Citation Envoyé par thelvin Voir le message
    Mais sinon il y avait aussi l'approche toute simple :

    vaseCommuniquant.vase[0]
    et
    vaseCommuniquant.vase[1]
    Il faudra alors changer la visibilité puisque "vase" est privé

    a++

Discussions similaires

  1. probleme avec les threads et class
    Par cosmoff dans le forum Général Python
    Réponses: 1
    Dernier message: 25/05/2015, 14h32
  2. [Débutant] Opération inter-Thread + inter-Class
    Par Orci76 dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/05/2012, 09h59
  3. Threads et classes
    Par Unibozu dans le forum C++
    Réponses: 3
    Dernier message: 20/03/2007, 10h14
  4. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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