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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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
    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
    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 confirmé 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
    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
    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
    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 confirmé 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
    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

  6. #6
    Membre confirmé 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
    Par défaut
    bon je vais mettre la discussion en résolue vu que mon problème est réglée.
    merci à vous

  7. #7
    Expert éminent
    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
    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 ?

  8. #8
    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
    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é>

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

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