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

Collection et Stream Java Discussion :

fonctionnement de CopyOnWriteArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 60
    Par défaut fonctionnement de CopyOnWriteArrayList
    Bonjour,

    j'aurais une question au sujet de la collection CopyOnWriteArrayList.
    Si j'ai bien compris, elle permet de modifier une liste en train d'être parcourue sans lever de ConcurrentModificationException.
    Les lectures seraient apparemment prioritaires au écritures (je n'en suis pas sûre de ça).

    J'aimerais pouvoir modifier une liste en train d'être parcourue (de manière assez rare, au plus 2 fois durant le parcours) mais que le thread en train de parcourir cette même liste prenne en compte ces modifications (les modifications sont en fait uniquement des ajouts d'éléments dans la liste).
    Est-ce que c'est possible avec cette collection?
    Sinon, Java fournit-il une classe que me permette de faire ça?

    Merci d'avance pour vos réponses!

  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,


    Non, si tu modifies la listes pendant son parcours, tu auras temporairement deux listes :
    • La liste originale associé à ton Iterator.
    • La liste modifié associé à ta List.


    Tu n'auras pas de ConcurrentModificationException mais tu ne verras pas les modifications tant que tu ne recrées pas un nouvel Iterator.

    De plus cette classe peut s'avérer assez couteuse...



    Que veux-tu faire précisément avec tout cela ???

    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 60
    Par défaut
    Merci pour ta réponse.

    Ce que je veux faire, c'est qu'un thread effectue un traitement avec une liste d'objets et que l'utilisateur, via le thread de l'interface graphique, puisse ajouter dynamiquement à cette liste un ou deux objets qui devront être traités également.

    Ce que je pense que je vais faire, même si c'est une solution pas très propre, c'est que le thread qui effectue le traitement de la liste, à chaque itération, vérifie si des éléments n'ont pas été ajoutés :
    - je vais mettre un boolean ajoutObjet initialisé à false
    - dans l'itération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(Object o : l){
      if(ajoutObjet){
        je tue le thread actuel et je le relance avec la nouvelle liste
      }
      else{
        //effectuer traitement normal
      }
    }
    - lorsque l'utilisateur va cliquer sur un objet à ajouter, ça va appeler une méthode du thread qui met ajoutObjet à true

    Voilà, est-ce que tu pense qu'il existerait un moyen plus propre de faire ce que je veux?

    Merci pour ton aide

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 60
    Par défaut
    J'aurais également une autre question : est-ce que je suis obligée de manipuler ma liste avec un Iterator?

  5. #5
    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 androidisme Voir le message
    J'aurais également une autre question : est-ce que je suis obligée de manipuler ma liste avec un Iterator?
    Non... mais cela risque d'être galère à gérer...



    Sinon tu dois conserver les objets dans la liste ?
    Si la réponse est non, les BlockingQueue pourraient correspondre à ton besoin...


    a++

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 60
    Par défaut
    Merci pour ta réponse, je vais regarder du côté des BlockingQueue, vu que je n'ai pas à conserver les objets dans la liste.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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