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

Entrée/Sortie Java Discussion :

Lecture de fichier en multithread


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut Lecture de fichier en multithread
    Bonjour tout le monde,

    Je poste rarement dans le forum java, mais j'ai vraiment besoin de votre aide, svp.

    J'ai besoin de faire un programme simple en Java, qui prend un fichier texte (.txt) en argument et qui compte le nombre de mots dans ce fichier. Là rien de compliqué.
    La difficulté :

    Le fichier doit être lu séparément par 5 threads qui se répartissent en parts égales le fichier (le thread 1 comptera les mots des lignes 1 à 1/5 du fichier, le second des lignes 1/5 du fichier +1 à 2/5 et ainsi de suite). Ces 5 threads doivent être exécutés en même temps et lancés par un serveur et doivent tous retourner au serveru le nombre de mots contenus dans leur partie, qui lui en fera la somme.

    Voilà la difficulté, si vous pouviez m'aider ce serait vraiment génial, car j'ai de grosses lacunes dans la compréhension de l'utilisation de server et du multithread en java.

    Merci d'avance!!

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    Par rapport au problème que tu décris, je ne pense pas que tu aies réellement besoin des threads pour réaliser ton besoin, je veux dire par là que ça n'ira pas "plus vite" de faire 5 choses en même temps. JM Doudoux propose un cours sur les threads ici.

    Note: Si tu souhaites faire ça pour t'amuser, fait tout de même attention aux flottants avec tes 1/5.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    J'en suis parfaitement conscient, utiliser les threads de façon simultanée ne serait utile que pour traiter des fichiers texte très lourds.

    Cependant c'est l'exercice le plus simple que j'ai pu trouver, mais dont il n'existe pas de solution. Je me demandais si quelqu'un pouvait m'en fournir une car j'ai de réelles difficultés avec l'utilisation de serveur multithreadé. Et le cours de M. Jean-Michel Doudoux ne m'a rien apporté de plus pour réussir, au contraire cela n'a fait que m'embrouiller encore plus. Ce que je souhaiterais, c'est avoir un exemple simple. Et je trouve l'exercice proposé particulièrement simple et facile à comprendre en ce sens.

    Alors svp, quelqu'un aurait la bonté de me proposer une solution? A moins que vous ne préféreriez me proposer des cours particuliers.

    Merci d'avance!

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    C'est un exercice sur la lecture multi-threadé de fichier que tu cherches, ou un exercice simple sur les threads ? Parce qu'un système producteur/consommateur, ou un buffer tournant, par exemple, est un exercice simple standard de mise en oeuvre des threads, avec possibilité de travailler le synchronised, les wait, les notify, puis les Locks.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    utiliser les threads de façon simultanée ne serait utile que pour traiter des fichiers texte très lourds
    Pourquoi penses-tu cela ? Je pense que tu n'as pas compris l'objectif des threads et dans quel contexte on les utilise.

    Cependant c'est l'exercice le plus simple que j'ai pu trouver
    Ce n'est pas l'exemple le plus simple que j'aurais donné pour faciliter ta compréhension, mais rien ne t'empêches de continuer sur ce dernier. Cependant tu parles de "serveur" et on a l'impression que ton besoin est adapté à un environnement web... on évite si possible d'utiliser les threads pour les projets web (surtout si c'est pour lire différents bouts d'un même fichier 5 fois) car non seulement ton client attendra quoi qu'il arrive l'ensemble du temps requis pour lire le résultat final mais en plus de cela créer des threads consomme des ressources (en gros tu vas consommer des ressources inutilement pour ce cas).

    Sincèrement le cours de JM Doudoux est pas mal, n'hésite pas à le relire tranquillement.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  6. #6
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Pourquoi penses-tu cela ? Je pense que tu n'as pas compris l'objectif des threads et dans quel contexte on les utilise.


    Ce n'est pas l'exemple le plus simple que j'aurais donné pour faciliter ta compréhension, mais rien ne t'empêches de continuer sur ce dernier. Cependant tu parles de "serveur" et on a l'impression que ton besoin est adapté à un environnement web... on évite si possible d'utiliser les threads pour les projets web (surtout si c'est pour lire différents bouts d'un même fichier 5 fois) car non seulement ton client attendra quoi qu'il arrive l'ensemble du temps requis pour lire le résultat final mais en plus de cela créer des threads consomme des ressources (en gros tu vas consommer des ressources inutilement pour ce cas).

    Sincèrement le cours de JM Doudoux est pas mal, n'hésite pas à le relire tranquillement.
    Aucune utilisation web attendue pour ma part, mais le but est ici d'utiliser un "serveur" (programme principal) qui répartirait la tâche aux différents threads. Mon réel problème est, je pense, que je ne comprend pas du tout comment les threads communiquent, et je ne trouve nulle part quelque chose qui l'explique clairement. J'ai remarqué à plusieurs reprise l'utilisation de PRINTWRITER et BUFFEREDREADER mais je n'y comprend rien.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    A mon avis, commence par mettre de côté cette notion de serveur : fait un programme qui prend en paramètre un fichier, point. Ensuite, tu pourras t'occuper de la notion de serveur (probablement offrant un service, restant à définir sous quel protocole), qui n'intervient pas dans le programme en lui-même.
    Ensuite, il me semble inutile de chercher à lire un fichier en multi-thread : à moins d'avoir un dispositif physique capable de lire en parallèle des données sur le support physique, effet de cache mis à part, ça a plutôt tendance à tout ralentir. Fais la lecture entière en une fois, en chargeant le fichier dans une liste, par exemple (ou un tableau, peu importe). Ensuite, tu peux répartir le traitement de cette liste (ou tableau) entre n threads.
    Ensuite :
    • Pour remplir la liste, soit tu utilises la méthode readAllLines de la classe Files qui va tout te charger d'un coup très facilement, soit tu utilises un BufferedReader pour lire le fichier ligne à ligne, que tu ajoutes à une liste au fur et à mesure. C'est du standard et tu trouveras l'exemple pourl le faire dans les FAQ.
    • A partir du moment où la liste est entièrement chargée, il n'est pas difficile de la découper en n sous-listes à procurer à n threads.
    • La communication entre threads se fait exactement comme pour une communication entre n'importe quels objets, avec des méthodes. Sauf que pour l'accès aux variables, il faut penser à aux problèmes de concurrences d'accès (si un thread accède à une variable (en lecture, comme en écriture) qu'un autre est en train de modifier). Ce que le tutoriel de JM Doudoux, ainsi que d'autres tutoriels sur le site Developpez expliquent très bien (voir donc Synchronized, Lock...). Il y a éventuellement la problématique d'attendre que tous les threads aient terminé leur tâche avant d'envoyer une réponse complète. Pour ça tu peux regarder la classe CountDownLatch par exemple, mais on peut faire ça aussi avec Thread.join() aussi.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Lecture d'un même fichier en multithreading
    Par Thierry5 dans le forum Entrée/Sortie
    Réponses: 18
    Dernier message: 08/08/2012, 11h53
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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