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 :

Bloquer les éléments d'une liste pendant un laps de temps


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut Bloquer les éléments d'une liste pendant un laps de temps
    Bonjour,

    je souhaite pouvoir bloquer/débloquer les éléments présents dans une java.util.List jusqu'à que l'utilisateur clique sur un bouton par exemple.

    Par exemple, j'aimerais pouvoir écrire l'action suivante pour mon bouton : «
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    JButton btnDebloquer = new JButton("Débloquer situation !");
    btnDebloquer.addActionListener(new ActionListener(){@Override
           public void actionPerformed(ActionEvent arg0) {
                   maListe.setBloquer(false);
           }
    });
    ».
    Au démarrage du test (les éléments de la liste sont bloqués), si on essaye d'ajouter des éléments à ma liste, il faudrait que ces actions soient mis dans une file d'attente jusqu'à que je clique sur le bouton btnDebloquer pour autoriser l'accès à ma liste.

    Savez-vous comment pourrais-je faire cela en java ?

    J'ai essayé de me créer la classe "ArrayListPerso" : «

    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
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    package listPerso;
     
    import java.util.ArrayList;
     
    public class ArrayListPerso<T> extends ArrayList<T> {
           /** Version de sérialisation */
           private static final long serialVersionUID = 1L;
     
           /** Bloquer l'ajout d'élement ? */
           private boolean bloquer = false;
     
           /**
            * Constructeur par défaut.
            */
           public ArrayListPerso() {
                   super();
           }
     
     
           /**
            * Retourne un boolean pour indiquer si on bloque l'ajout d'élément
            * dans la liste.
            *
            * @return true la liste des éléments est bloqué, false on peut
    modifier la liste.
            */
           public boolean isBloquer() {
                   return bloquer;
           }
     
           /**
            * Définit l'état de la liste : bloque-t-on tout ajout d'élément ou
    pas ?
            * @param bloquer true on bloque tout ajout d'élément, false on
    autorise tout modification.
            */
           public void setBloquer(boolean bloquer) {
                   if ((bloquer == false) && (this.bloquer == true)) {
                           this.bloquer = bloquer;
                           this.notifyAll();
                   } else {
                           this.bloquer = bloquer;
                   }
           }
     
           @Override
           public boolean add(T arg0) {
     
                   if (bloquer) {
                           System.out.println("L'ajout de l'élément " + arg0 + " est
    suspendu !");
                           try {
                                   this.wait();
                           } catch (InterruptedException e) {
                                   e.printStackTrace();
                           }
                   }
     
                   System.out.println("Ajout de l'élément " + arg0 + " effectué !");
                   return super.add(arg0);
           }
    }
    »

    et la classe de test : «
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public static void main(String[] args) {
                   try {
     
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                   } catch (Exception e) {
                           e.printStackTrace();
                   }
     
                   final ArrayListPerso<String> maListe = new ArrayListPerso<String>();
     
                   JFrame frame = new JFrame();
                   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
                   JButton btnDebloquer = new JButton("Débloquer situation !");
                   btnDebloquer.addActionListener(new ActionListener(){@Override
                           public void actionPerformed(ActionEvent arg0) {
                                   maListe.setBloquer(false);
                           }
                   });
     
                   frame.getContentPane().add(btnDebloquer, BorderLayout.CENTER);
                   frame.pack();
                   frame.setLocationRelativeTo(null);
                   frame.setVisible(true);
     
     
                   maListe.add("allo");
                   maListe.setBloquer(true);
                   maListe.add("coucou");
           }
    ».

    Voici les informations affichées dans la console : «
    Exception in thread "main" java.lang.IllegalMonitorStateException
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)

    at listPerso.ArrayListPerso.add(ArrayListPerso.java:50)
    at TestFabienListePerso.main(TestFabienListePerso.java:45)
    Ajout de l'élément allo effectué !
    L'ajout de l'élément coucou est suspendu !
    »

    alors que je souhaiterais avoir : «
    Ajout de l'élément allo effectué !
    L'ajout de l'élément coucou est suspendu !
    », puis, quand je clique sur le bouton : «
    Ajout de l'élément coucou effectué !
    ».

    Merci d'avance pour votre aide.
    F.

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    pourquoi tu colles des wait() et notifyAll(), en fait c'est pas ton thread que tu veux bloquer vu que tu veux utiliser un tampon ? Si j'ai bien compris tu dois pouvoir faire comme ceci :
    1) ajouter un Vector buffer dans ta liste.
    2)
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public class ArrayListPerso<T> extends ArrayList<T> {
           /** Version de sérialisation */
           private static final long serialVersionUID = 1L;
     
           /** Bloquer l'ajout d'élement ? */
           private boolean bloquer = false;
     
           private Vector buffer;
     
           /**
            * Constructeur par défaut.
            */
           public ArrayListPerso() {
                   super();
                   this.buffer = new Vector();
           }
     
           public boolean isBloquer() {
                   return bloquer;
           }
           public void setBloquer(boolean bloquer) {
               this.bloquer = bloquer;
               if(!bloquer)	{
            	   this.moveBufferToList();
               }
           }
     
           public void moveBufferToList()	{
        	   super.addAll(this.buffer);
        	   this.buffer.removeAllElements();
           }
     
           public boolean add(T arg0) {
                   if (bloquer) {
                	   return this.buffer.add(arg0);
                   }
                   return super.add(arg0);
           }
    }
    Bye

  3. #3
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Sinon c'est préférable de ne pas étendre ArrayList mais d'implémenter List et d'utiliser une ArrayList comme wrapper dans ta liste perso.
    Sinon Vector ne devrait plus être utilisé, les bonnes pratiques indiquent qu'il faut synchroniser une liste (moins dépendant de l'implémentation).

    En code pour être clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class BlocableList<T> implements List<T> {
     
           private List<T> wrapper = new ArrayList<T>();
     
           /** Bloquer l'ajout d'élement ? */
           private boolean bloquer = false;
     
           private List<T> buffer = Collections.synchronisedList(new ArrayList<T>());
     
           // implementation des méthodes de List en utilisant le wrapper
     
           // méthodes spécifiques de la BlocableList
     
    }
    L'avantage c'est que tu évites de donner l'accès à des méthodes spécifiques de ArrayList et que donc si un jour tu préfères utiliser une LinkedList par exemple, tu le fais en 1 ligne de code seulement sans le moindre problème.

  4. #4
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Sinon Vector ne devrait plus être utilisé, les bonnes pratiques indiquent qu'il faut synchroniser une liste (moins dépendant de l'implémentation).
    Salut, peux-tu préciser ? Vector est syncro.

  5. #5
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Salut, peux-tu préciser ? Vector est syncro.
    http://www.developpez.net/forums/sho...41&postcount=9

    En gros, utiliser une List (et de la déclarer en tant que telle avec uniquement l'interface List) permet de pouvoir changer d'implémentation facilement si un jour tu le souhaites, si tu utilises un Vector, tu seras beaucoup plus dépendant de cette classe (quoique maintenant Vector implémente List, mais il faut faire List list = new Vector() et non Vector v = new Vector()).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    super
    Merci à tous et à toutes pour vos réponses claires et précises.


    F.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2007, 16h46
  2. Réponses: 1
    Dernier message: 21/04/2007, 16h36
  3. Réponses: 12
    Dernier message: 04/03/2007, 11h43
  4. Tri aléatoire parmis les éléments d'une liste
    Par ahouba dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 18h03
  5. Réponses: 3
    Dernier message: 15/05/2006, 16h09

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