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 :

Communication entre thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Par défaut Communication entre thread
    Bonjour,

    J'essaye de faire communiquer deux thread à l'aide de pipe. L'un ecrit des données et l'autre les lit


    Thread1 ( thread qui ecrit )
    PipedOutputStream iPOS = new PipedOutputStream()
    Création de Thread2 avec iPOS en apramètre du constructeur
    ObjectOutputstream iOOS = new ObjectOutputstream(iPOS)

    Thread2 ( thread qui lit )
    PipedIntputStream iPIS = new PipedIntputStream (iPOS)
    ObjectIntputstream iOIS = new ObjectIntputstream (iPIS)

    Jusque là, tout ce passe bien.. les flux sont bien créé.

    Je cherche à ce que le thread2 ait le comportement suivant :
    il est à l'écoute du pipe et dès qu'il recoit un message, il effectue un traitement et il se remet à l'écoute d'un eventuel message ...et tant le thread ne recoit pas de message, il ne fait rien....

    Je pensais que l'appel à iOIS.readObject() me permettrait de réaliser cette mise à l'écoute.
    Le premier message recu et bien traité :
    exemple de message :
    SYS com traite :Message de :SYS vers BA contenu :utils.Evenement@64c34e

    Mais quand dans ma boucle, le thread se repositionne à l'écoute (donc en attente du message n°2), j'ai le message suivant



    java.io.IOException: Write end dead
    at java.io.PipedInputStream.read(Unknown Source)
    at java.io.ObjectInputStream$PeekInputStream.peek(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.peek(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at communication.JFPSCommunicationManager.run(JFPSCommunicationManager.java:241)

    Faut-il faire une action particuliere apres un readObject pour pouvoir se repositiooner à l'écoute.

    J'ai consulté des docs mais je n'ai pas trouvé ma solution. Je vous remercie d'avance de votre aide.

  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,


    Il me semble que ce type d'erreur peut survenir si le buffer de ton PipedInputStream est plein (mais je ne suis pas sûr de ca il y a de forte chance que je me trompe).

    Maintenant il semble que tu désires seulement "passer" des objets d'un thread à l'autre, et je ne penses pas que ce soit la meilleure solution (obligation de sérializer/désérialiser les objets, donc il seront alloué deux fois...).

    Si tu utilises Java 5.0, tu peux directement utiliser une BlockingQueue

    Initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BlockingQueue<Object> queue = new LinkedBlockingQueue<Object();
    Thread 1 :
    Thread 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object object = queue.take();
    Tu n'a rien à gérer mis a part les InterruptedException, toutes la synchronisation est déjà géré (si il n'y a rien, take() mettra ton thread 2 en attente)...


    Enfin si tu n'utilises pas encore Java 5.0, tu peux faire la même chose avec une collection normal en utilisant des bloc synchronisé et des wait() et des [b]notify()[/n], mais c'est un peu plus complexe à gérer...

    a++

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Par défaut
    Merci je vais essayer ta solution car j'ai environ une trentaine de thread qui commnuiquent entre eux...et entre les Piped..et les Object... ca commence à faire du monde...

    Je ne connaissais pas les blockingQueue qui devraient me simplifier la tache...

    Merci beaucoup

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

Discussions similaires

  1. communication entre threads
    Par dc.sara dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2008, 04h48
  2. [C#] Communication entre thread
    Par kekesilo dans le forum Windows Forms
    Réponses: 11
    Dernier message: 17/09/2007, 19h48
  3. [thread] communication entre threads
    Par untipy dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 30/08/2007, 15h47
  4. Problème de communications entre threads
    Par maya09 dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2006, 22h18
  5. [c#][threading] communication entre threads
    Par orelero dans le forum C#
    Réponses: 6
    Dernier message: 02/01/2006, 00h42

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