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 :

Faire attendre un Thread jusqu'à la fin d'un autre


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut Faire attendre un Thread jusqu'à la fin d'un autre
    Bonjour,
    je reviens vers vous à nouveau car j'ai un problème.
    comme l'indique le titre je voudrais qu'un Thread attend la fin d'un autre.
    je m'explique :
    j'ai une fonction d'extraction d'archives qui est lancée depuis un thread :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
        public synchronized void extraireToutZip() {
            byte[] buffer = new byte[1024];
     
            try {
                final Collection<File> all = new ArrayList<File>();
                findFilesRecursively(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016"), all, ".zip");
     
                for (File file : all) {
                    System.out.println(file.getName());
                    ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
                    ZipEntry ze = zis.getNextEntry();
                    while (ze != null) {
                        String fileName = ze.getName();
                        File newFile = new File(file.getParentFile() + File.separator + fileName);
     
                        // je vérifie si le fichier existe déjà pour ne pas l'extraire à nouveau
                        while (!newFile.getAbsoluteFile().exists()) {
                            System.out.println("Extraction du fichier : " + newFile.getAbsoluteFile());
                            if (ze.isDirectory()) {
                                String temp = newFile.getCanonicalPath();
                                new File(temp).mkdir();
                            }
                            else {
                                FileOutputStream fos = new FileOutputStream(newFile);
                                int len;
                                while ((len = zis.read(buffer)) > 0) {
                                    fos.write(buffer, 0, len);
                                }
                                fos.close();
                            }
                            break;
                        }
                        /*else {
                            System.out.println("Déjà extraite !");
                            break;
                        }*/
                        ze = zis.getNextEntry();
                    }
                    zis.closeEntry();
                    zis.close();
                    System.out.println("Extraction complétée");
                }
            }
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    et une fonction qui lis les fichiers extraites, lancée depuis un Thread aussi:
    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
    27
    28
    29
    30
    31
    32
    33
     
        public synchronized void lireTout() throws IOException
        {
            ArrayList<String> allFiles = new ArrayList<String>();
            listeRepertoire(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016"), allFiles);
     
            try
            {
                File f;
                FileReader fr;
                BufferedReader br;
                for (String file : allFiles)
                {
                    f = new File(file);
                    fr = new FileReader(f);
                    br = new BufferedReader(fr);
                    System.out.println(f.getAbsolutePath());
                    String ligne = br.readLine();
                    while (ligne != null)
                    {
                        //System.out.println(ligne);
                        ligne = br.readLine();
                    }
                    // ligne = br.readLine();
                    br.close();
                    fr.close();
                }
            }
            catch (IOException exception)
            {
                System.out.println("Erreur lors de la lecture : " + exception.getMessage());
            }
        }

    j'ai jamais fais de Thread du coup j'ai suivi le tuto http://viennet.developpez.com/cours/java/thread/
    du coup dans le controller je fais :
    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
     
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    	    //j'extraie depuis un Thread pour que l'extraction se lance en asynchrone
    	    ThreadZip tZip = new ThreadZip();
    	    ThreadFichier tFichier = new ThreadFichier();
    	    tZip.start();
    	    while(tZip.getState().equals("RUNNABLE")) {
    	        try
                {
                    tFichier.wait();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
    	    }
    	    tFichier.start();
    	}
    j'ai tout essayé mais je sais pas quoi faire
    je voudrais que tFichier attend jusqu'à que tZip ait fini

  2. #2
    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,



    Mais... Pourquoi utiliser des threads si tu veux avoir des traitements séquentiels ?


    a++

  3. #3
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    je peux faire sans l'utilisation des Threads ?
    j'ai peut être oublié de dire que j'utilise les Threads pour que ces fonctions se lancent en asynchrone vu que je suis sur une appli web.

    enfaite au début je voulais que l'extraction soit en arrière plan pour que la page n'attende pas la fin de l'extraction. du coup on m'a dit d'utiliser les Thread.

    et donc je me suis dis que pour la lecture des fichiers extraites je dois utiliser un Thread aussi parce que si les fichiers ne sont pas extraites alors il n'y a pas encore de fichiers à lire. (pour le lancer en arrière plan aussi)

    si c'est possible de faire sans les Thread je suis preneur vu que j'y connais rien dessus

  4. #4
    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
    Citation Envoyé par Mr.Robot12 Voir le message
    j'ai peut être oublié de dire que j'utilise les Threads pour que ces fonctions se lancent en asynchrone vu que je suis sur une appli web.
    En asynchrone avec quoi ?
    Pas entre elle en tout cas, car sinon tu n'aurais pas à attendre la fin d'un thread pour démarrer l'autre (parce que çà c'est pas du tout de l'asynchrone).

    Citation Envoyé par Mr.Robot12 Voir le message
    enfaite au début je voulais que l'extraction soit en arrière plan pour que la page n'attende pas la fin de l'extraction. du coup on m'a dit d'utiliser les Thread.

    et donc je me suis dis que pour la lecture des fichiers extraites je dois utiliser un Thread aussi parce que si les fichiers ne sont pas extraites alors il n'y a pas encore de fichiers à lire. (pour le lancer en arrière plan aussi)
    Dans ce cas utilise un thread pour TOUT le traitement, et non pas deux threads...

    Citation Envoyé par Mr.Robot12 Voir le message
    si c'est possible de faire sans les Thread je suis preneur vu que j'y connais rien dessus
    Qu'elle est l'objectif de tout cela exactement ?


    PS : sinon n'oublies pas les try-with-ressource lorsque tu ouvres un fichier, pour éviter de laisser trainer des fichiers ouvert en cas d'erreur...

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Non non c'est pas ça le problème tu utilises des threads et c'est très bien (encore que, en mode web/jee, c'est plutôt déconseillé), par contre, pourquoi vouloir attendre dans un thread qu'un autre ait fini?

    C'est ça le non-sens, tu vérifie l'état d'un thread et tu l'exploite, mais tu n'attends pas qu'un thread soit fini pour continuer. Sinon ce n'est plus du multithread, c'est du mono-thread déguisé.

    Ce que tu derais plutôt faire, c'est informer le consommateur que la tâche n'est pas encore terminée. Ton thread http-x va lire l'état du thread zip-1, et s'il n'a pas fini, remonte directement l'information "pas terminé" au consommateur.

    PS: si vraiment tu veux le faire, tu peux, c'est la méthode yield: Thread#yield mais ce n'est pas conseillé

    EDIT: c'est pas yield c'est join.... </fatigué>
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  6. #6
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Dans ce cas utilise un thread pour TOUT le traitement, et non pas deux threads...
    c'est ce que je me disais aussi et j'ai essayé en mettant les 2 fonctions dans un seule thread et du coup c'est bon

    ce que je voulais c'est que la page n'attende pas que ces 2 fonctions soit fini pour s'afficher

  7. #7
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    bon je vais mettre la discussion en résolue vu que mon problème est réglée.
    merci à vous

  8. #8
    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
    Oui mais que doit faire cette page ? Simplement lancer tout cela sans rien attendre en retour ?
    Tu es conscient que si la page est appelée plusieurs fois cela va relancer plusieurs fois ce traitement.

    => Quel est l'objectif de cette page ?

  9. #9
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Oui mais que doit faire cette page ? Simplement lancer tout cela sans rien attendre en retour ?
    Tu es conscient que si la page est appelée plusieurs fois cela va relancer plusieurs fois ce traitement.

    => Quel est l'objectif de cette page ?
    j'ai fais ça dans l'hypothèse où entre temps il y a une nouvelle archive etc....
    parce que ces archives sont sur un serveur.

    la page est une sorte de wiki en faite. les données des fichiers contiennent des données que je dois utiliser ensuite.

    justement pour éviter que l'extraction se relance à chaque fois j'ai mis un contrôle qui vérifie si les archives sont déjà extraites ou pas. à terme je fais faire pareille je pense pour la lecture des fichiers.

    si non je peux le mettre dans le init pour que ce soit lancé une seule fois aussi

  10. #10
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Hum... Je n'arrive pas trop à comprendre.

    Tu mets à disposition une servlet qui permet de dézipper une archive (qui est je ne sais où).
    Et qu'advient-t'il de l'archive dézippé ?

    Est-ce que tu pourrais remettre à plat ton besoin. L'utilisation de thread n'est à mon avis, non pertinente dans ton cas.

    Et, il faut vraiment plus découper ton code.
    Rien que pour la notion de "zip/dezip", il faut absolument créer une classe "ZipUtil" (ou "CompressUtil" etc.) avec une méthode du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static public void unzip(File directory, File zipFile) throws IOException;
    Elle peut-être testée unitairement tranquillement et n'a rien à faire au sein d'une classe aussi complexe.
    Je ne répondrai à aucune question technique en privé

  11. #11
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    si les archives n'ont pas été dézippé alors je les dézippe. j'ai mis un thread pour que l'extraction se fasse en arrière plan (pour que la page n'attende pas la fin de l'extraction pour s'afficher)
    ensuite je lis chaque fichier dézippé. à terme je dois enregistrer les données que contiennent les fichiers dans une BDD.

    j'ai mis un thread parce que c'est ce qu'on m'a dit de faire.

    et la méthode unzip est bien dans une classe ZipFichier.
    et la méthode qui lit les fichiers est dans une autre classe.

  12. #12
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Ce que millie voulait dire ('fin j'pense), c'est qu'il faut faire attention à découper correctement tes classes. Par exemple, un thread (toute classe étendant Thread) ne devrait pas faire grand chose à part appeler une (voir plusieurs) autre classe (qui elle n'étend pas thread) qui fait le boulot.

    Le problème des threads, c'est qu'ils sont très difficiles à tester - et on sait que tout ce qui n'est pas testé, fini par merder

    Isoler la complexité (dézipper est une tâche complexe!) dans une classe à part permet de la tester unitairement toute seule, isolée de tous les facteurs externes risquant d'influencer ou complexifier les tests. C'est pour ça qu'on parle de tests "unitaires".

    PS: je rappelle que dans un environnement JEE (et même JEE-like), lancer soi-même des Threads est une mauvaise pratique. Il faut plutôt utiliser les API du container (par exemple, Worker, Executor, etc.), que l'on obtient via un lookup JNDI, qui lui s'occupera de fournir un thread managé, sorti d'un pool, que l'on pourra (le cas échéant) administrer via les outils du container (console d'admin et autres jmx)
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  13. #13
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    Ce que millie voulait dire ('fin j'pense), c'est qu'il faut faire attention à découper correctement tes classes. Par exemple, un thread (toute classe étendant Thread) ne devrait pas faire grand chose à part appeler une (voir plusieurs) autre classe (qui elle n'étend pas thread) qui fait le boulot.
    c'est ce que je fais en faite. la classe qui étend Thread ne fais que les appels aux méthodes qui eux sont dans des classes différentes.

    Citation Envoyé par Pill_S Voir le message
    PS: je rappelle que dans un environnement JEE (et même JEE-like), lancer soi-même des Threads est une mauvaise pratique. Il faut plutôt utiliser les API du container (par exemple, Worker, Executor, etc.), que l'on obtient via un lookup JNDI, qui lui s'occupera de fournir un thread managé, sorti d'un pool, que l'on pourra (le cas échéant) administrer via les outils du container (console d'admin et autres jmx)
    pour utiliser les API que vous avez dit il faut un framework ? parce que je développe en JAVA sans framework.

  14. #14
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Oui, qui dépend de la plateforme sur laquelle vous développez (Tomcat, Websphere, Weblogic, JBoss, etc...)
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  15. #15
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    je développe sur tomcat

  16. #16
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Alors ça, ça pourrait être utile: http://commonj.myfoo.de/install.shtml
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  17. #17
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    je vais regarder ça merci

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    a noter qu'en J2EE (si tu peux ajouter les EJBs dans ton tomcat) il y a l'annotation @Asynchronous qui sert justement à faire exécuter une méthode en tâche de fond.

  19. #19
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    là où je fais mon stage j'ai pas les droits d'installer des appli ou en modifier du coup EJB je pourrai pas

  20. #20
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    Ce que millie voulait dire ('fin j'pense), c'est qu'il faut faire attention à découper correctement tes classes. Par exemple, un thread (toute classe étendant Thread) ne devrait pas faire grand chose à part appeler une (voir plusieurs) autre classe (qui elle n'étend pas thread) qui fait le boulot.
    Oui, je voulais effectivement dire ça
    Je ne répondrai à aucune question technique en privé

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Faire attendre un Thread Tomcat qu'un autre Thread finisse son action
    Par n2engineer5 dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 21/03/2013, 14h39
  2. Réponses: 5
    Dernier message: 20/06/2012, 17h29
  3. Réponses: 6
    Dernier message: 26/03/2012, 11h21
  4. [Débutant] Lancer une Thread après la fin de deux autres
    Par Zarrows dans le forum C#
    Réponses: 12
    Dernier message: 10/02/2012, 14h43
  5. Faire attendre le Thread courant
    Par womannosky dans le forum C#
    Réponses: 7
    Dernier message: 13/03/2009, 14h59

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