Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Programmation.java : Mettre un objet "end of stream" dans une queue paramétrée

Posté par gc (page perso, ) le 25 juin 2007
J'utilise une BlockingQueue[1] pour implémenter un traditionnel producteur-consommateur en java 1.5. Afin d'être un bon gars, je termine le consommateur lorsqu'il voit un objet end of stream (voir la doc pour l'explication de l'intérêt de l'objet end of stream). Mon problème, c'est que je veux rendre ma classe qui wrappe le consommateur générique (pour éviter des casts aux utilisateurs de ma classe) ; e.g. au lieu de spécifier une interface pour les objets à ajouter dans la queue (ou de laisser des Object passer), je veux utiliser un type générique T ; du coup, je n'arrive pas à écrire mon objet end of stream : je ne peux ni implémenter ni étendre le type T.



Pour illustrer :



- j'ai une classe "public class Consommateur<T>"

- dedans j'ai une "private BlockingQueue<T> queue"

- pour produire, j'appelle "addElement(T)" qui rajoute dans la queue

- pour consommer, le consommateur bouffe des T aussi bien sûr

- et pour terminer, je souhaite faire addElement(EndOfStream) mais je n'arrive pas à "écrire" la classe EndOfStream puisque je ne peux ni hériter ni implémenter T



Une idée ?



[1] http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent(...)

> Lire le message (5 commentaires, moyenne: 1).  

Vous avez demandé le commentaire #845136.

Encapsulation du T dans une classe "Message"

Posté par shbrol () le 25/06/2007 à 11:27. (lien). Évalué à 1.

remplace la "private BlockingQueue queue" par une "private BlockingQueue< Message >", ou Message contient un reference vers un T, qui peut etre null pour signifier le EndOfStream (ou un flag, ou autre...).
Les consommateurs recoivent des Message, ils accedent a la valeur via un accesseur (toujours pas de cast).

Petite remarque en passant : les EndOfStream c'est bien quand tu connais le nombre de consommateurs a arreter (je ne sais pas si c'est dans la doc, je ne l'ai pas lue...)

  • [^]Re: Encapsulation du T dans une classe "Message"

    Posté par shbrol () le 25/06/2007 à 11:29. (lien). Évalué à 1.

    Rhaaaaa, me suis fait manger les chevrons... Il faut lire:

    remplace la "private BlockingQueue<T > queue" par une "private BlockingQueue< Message<T> >"

    • [^]Re: Encapsulation du T dans une classe "Message"

      Posté par gc (page perso, ) le 25/06/2007 à 12:19. (lien). Évalué à 1.

      pourquoi pas.. mais ca m'ennuie de provoquer cette indirection supplementaire pour produire et consommer :/

      • [^]Re: Encapsulation du T dans une classe "Message"

        Posté par shbrol () le 25/06/2007 à 12:46. (lien). Évalué à 1.

        J'ai bien l'impression que tu ne peux pas faire autrement... une solution simple aurait été d'inserer une reference nulle dans la queue, mais j'ai le souvenir que ce n'est pas possible avec BlockingQueue (=>Exception).

        • [^]Re: Encapsulation du T dans une classe "Message"

          Posté par gc (page perso, ) le 25/06/2007 à 13:30. (lien). Évalué à 1.

          Oui effectivement. Après réflexion, je peux wrapper cette indirection, donc les "réels" utilisateurs ne la verront pas, et roulaize. Merci en tous cas de ton aide !