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 :

Ajout dans une arrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut Ajout dans une arrayList
    Bonjour,

    Introduction au problème:

    Une application de monitoring d'instances de DB. Il est possible de checker un certains nombres d'informations concernant la santé d'une instance. Si elle à un soucis, si oui, lequel, si elle va bien, etc... Application client serveur qui utilise les thread. Un thread consulte les entrées dans une table, ces entrées sont des noms d'instance. Et pour chaque instance trouvée dans la table, le thread initial crée un thread enfant et attache ce thread enfant à l'instance afin qu'il la monitore. Seulement côté client, on peut rentrer à peu près n'importe quel nom d'instance en ligne de commande, et évidemment si on entre n'importe quoi, le serveur reçoit un nom d'instance qu'il ne monitore pas, est donc incapable de renvoyer les informations voulues, et ... plante.

    Pour règler ce problème, dés que je démarre le serveur, j'aimerais qu'une liste des instances monitorées soit remplie. Afin que lorsque du côté client on entrera n'importe quoi, il suffira de tester si ce qu'on à entré se trouve dans la liste (une instance portant ce nom est donc bien monitorée pour le moment) et donc on pourra entrée dans le suite du code (les traitements).

    Pour ce je compte ajouter les instances dans une Arraylist.

    Voici comment je m'y prend pour ajouter des Strings dans cette ArrayList:

    J'ai un objet/class "answer", dans laquelle je définis une Arraylist, et une méthode pour y ajouter un élément (String)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public ArrayList instances = new ArrayList();
    .
    .
    .
    public void setInstances(String instance)
    {
        instances.add(instance);
    }
    Dans une autre classe, je crée un objet Answer que je nomme "ans", et y ajoute une String:
    [ODE]
    ans.setInstances(db_name);
    [CODE]

    Dans une autre class, je consulte la taille de mon Arraylist:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("instances size: "+ans.instances.size());
    instances est mon arraylist...
    Et là la taille est égale à 0. Elle devrait être égale à 14.


    Pistes de réflexion: J'utilise des threads pour ajouter mes strings à mon arraylist. Mais normalement il n'y a pas d'accès concurrents à l'arraylist. Puis même si, au moins le premier éléments, la première string serait ajoutée, ou la dernière, j'aurais une taille de 1. Mais là, 0 :-(

    Vous voyez pourquoi ?

    Bonus:
    Je compte bien parcourir mon arraylist de cette manière (pour checker si l'instance de laquelle on veut obtenir une quelconque info se trouve bien monitorée pour le moment):
    (dans mon objet Answer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public boolean getInstance(String db_name)
    {
            boolean test = false;
            if(instances.contains(db_name))
            {
                test = true;
            }
            return test;
    }
    Ensuite côté client on envoie n'importe quoi mais côté serveur ce qui est réceptionné (un nom d'instance) est testé, si getInstance(db_name) renvoie true, bha alors l'instance est monitorée et l'application serveur peut entamer la collecte d'informations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(ans.getInstance(command2)==true)
    {
             flag3=true;
    }
    Command2 contient le nom de l'instance...

    Puis si flag3==true on entame la collecte donc.

    Conceptuellement je m'y prend bien ?

    Où se situe mon problème d'après vous ?

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Premiere remarque :

    dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public boolean getInstance(String db_name)
    {
            boolean test = false;
            if(instances.contains(db_name))
            {
                test = true;
            }
            return test;
    }
    Tu fais "si c'est vrai, retourner vrai, sinon retourner faux", autant faire dirrectement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public boolean getInstance(String db_name)
    {
           return instances.contains(db_name);
     
    }
    Ensuite, si tu utilises des thread, il faut synchroniser et ne pas se dire "normalement ya pas d'acces concurent", il peut y en avoir alors on synchronise ---> Collections.synchronizedList(List)

    F.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Tu ne dois donc avoir qu'1 instance de ta classe Answer, et ce pour toutes les threads, c'est bien ça ?

    Pourquoi alors ne pas passer par un singleton pour cette classe conteneur ? Ainsi, chaque "new Answer" te retournera bien la seule et unique instance, ou la créera en cas de besoin.

    +1 pour la synchro

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Bon alors avec la synchronisation ça fonctionne déjà un peu mieux.

    Et pour les singletons, je vais y jeter un oeil. J'en ai beaucoup entendu parler, mais je croyais que le fait de déclarer un objet static suffisait à ce qu'il ne soit instancié qu'une seule fois...

    Sinon Oui DevTeam_, je ne dois avoir qu'une seule instance de l'objet answer...

    J'ai dû me planter là-dedans aussi

    Je vous tiens au courant, d'ici là si vous avez d'autres idées je suis preneur.

    Merciiiii.

    EDIT: En effet les singletons ont l'air tout à fait intéressant mais dans mon cas, il semblerait plus que délicat (ou me demanderait un tas de modifications) à mettre en place...

    Donc je vais essayer de continuer sans les singletons ^^

Discussions similaires

  1. Ajout de données dans une ArrayList
    Par k-sper dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 14/11/2010, 23h27
  2. Ajout de données dans une ArrayList
    Par McArthur dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 08/11/2010, 11h59
  3. Des problèmes pour ajouter valeur dans une ArrayList
    Par Fused dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/11/2008, 16h28
  4. L'ajout d'une date dans une ArrayList
    Par Eternel_F dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/05/2008, 12h28
  5. java.lang.StackOverflowError lors de l'ajout dans une ArrayList
    Par alys56 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 02/04/2008, 18h54

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