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 :

Probléme de retour d'un type ArrayList dans une méthode JAVA


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut Probléme de retour d'un type ArrayList dans une méthode JAVA
    Bonjour:
    j'ai une méthode JAVA avec un type de retour ArrayList,quand je met le return dans une boucle while le j'ai une erreur qui s'affiche dans le code de type missing return statement.

    Voilà le boue de code concernant le sujet:
    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
    public ArrayList RecupFam()throws SQLException{
            ArrayList listfam=null;
            String requete;
            PreparedStatement ps = null;
            ResultSet rs = null;
            Date maj;
            String imma;
            maj=GetDatMaj();
                try{
               java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime());
               int year=sqlDate.getYear();
               year=year-2;
               sqlDate.setYear(year);
               requete="SELECT distinct(IMM_V_NUM_IMM)"
               +" FROM   D_ASS"
               +" WHERE  TEV_C_EVOP    LIKE '21%' "
               +"AND    TPR_C_PREST   IN ('AE','AM','AN','AR','AA') ";
                ps=conn.getConnexion().prepareStatement(requete);
                ps.setDate(1, sqlDate);
                rs=ps.executeQuery();
                while(rs.next()){
                     imma=rs.getString("IMM_V_NUM_IMM");
                     listfam=GetFamille(imma);
                     return listfam;
                 }
            catch (Exception exx){
                 System.err.println("[RecupFam-DatMaj] - [Erreur] - Erreur  de la requete!");
                 System.err.println("[RecupFam-DatMaj] - [Message] - " + exx.getMessage());}
                }
             try {
                ps.close();
             } catch (Exception exx) {}
               try {
                rs.close();
            } catch (Exception ex) {}
     
      }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Points : 422
    Points
    422
    Par défaut
    Un code peu prendre plusieurs directions dans une méthode en fonction des if, while ou autrre éléments prenant des conditions en paramètre.
    Il faut que chacun de ces chemins se terminent pas un return pour que la méthode soit considérée comme valide.

    Un while n'est lu que si la condition est true.
    Tu n'as donc pas de return dans tous les chemin de ton code.

    Dans ton cas, le plus simple est de rajouter en bout du code un return null, ou alors un return new ArrayList();

    Mais à mon avis, ton code à d'autres soucis. Es-tu sûr de vouloir faire un return dans le while ?? et non pas une fois que le while est terminé ?

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Même sans le while, il y a un try / catch. Quand on est sorti du catch, il faut bien renvoyer quelque chose, si on ne remonte pas l'exception.

  4. #4
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Je conseille toutefois que dans chaque méthode il faut se forcer à obtenir qu' un seul return et cela doit être la dernière instruction de la méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public Object method() {
    		Object result = null;
     
    		// mon code ici
     
    		return result;
    	}
    Pour son cas, il veut retourner la première liste trouvée dans sa boucle while. Pour y arriver il suffit d'ajouter un test supplémentaire dans son while

    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
    	public List RecupFam() throws SQLException {
    		List listfam = null;
     
    		try {
    			while(rs.next() && listfam == null) {
    				imma = rs.getString("IMM_V_NUM_IMM");
    				listfam = GetFamille(imma);
    			}
     
    		} catch (Exception exx) {
    			System.err.println();
     
    		} finally {
    			try {
    				ps.close();
    			} catch (Exception exx) {}
     
    			try {
    				rs.close();
    			} catch (Exception ex) {}
    		}
     
    		return listfam;
    	}

  5. #5
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut Probléme de retour d'un type ArrayList dans une méthode JAVA
    Merci pour vos réponse
    @billynirvana
    Pour son cas, il veut retourner la première liste trouvée dans sa boucle while. Pour y arriver il suffit d'ajouter un test supplémentaire dans son while
    Mon problème Je veut retourner la liste de fur et à mesure ,c'est à dire je veux ajouter des éléments à ma liste et retourner à la fois.
    Donc si je met un seul return à la fin j'aurai pas le resultats souhaité,et même si je met le test while(rs.next() && listfam == null) je n'aurai qu'un seul éléments dans ma liste retourné

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par KnowPart Voir le message
    Mon problème Je veut retourner la liste de fur et à mesure ,c'est à dire je veux ajouter des éléments à ma liste et retourner à la fois.
    Donc si je met un seul return à la fin j'aurai pas le resultats souhaité,et même si je met le test while(rs.next() && listfam == null) je n'aurai qu'un seul éléments dans ma liste retourné

    Une méthode ne retourne pas au "fur et à mesure", si le but et de récupérer les résultats un par un, il faut que la méthode renvoi un seul objet et l'appeler plusieurs fois...

  7. #7
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut Probléme de retour d'un type ArrayList dans une méthode JAVA
    De fur et à mesure c'est l'expression pour éclaircir ma conception,et une méthode ou une fonction peut retourner plusieurs valeur et être appelé une seul foi d'ailleurs c'est le cas pour moi:je veut avoir un retour(return) dans un while qui boucle sur un record statement d'une requête select,et par conséquent le premier retour de la liste contient un seul élément ,le deuxième deux et ainsi de suite.

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par billynirvana Voir le message
    Je conseille toutefois que dans chaque méthode il faut se forcer à obtenir qu' un seul return et cela doit être la dernière instruction de la méthode.
    Dans mon expérience, ça rend le code rapidement illisible, avec des blocs de if / else immenses pour vraiment rien.
    D'ailleurs, les classes de l'API Java ne sont pas du tout implémentées comme ça. Il suffit d'aller regarde à peu près n'importe quelle méthode equals, par exemple. Et franchement, je trouve ça tellement plus intuitif : quand on a déterminé un résultat, on sort.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    on le dit et on le répète, un méthode ne retourne qu'un seule fois.

    Si vous voulez qu'elle retourne la liste de tous les éléments, il faut les ajouter au fur et à mesure à votre arraylist et, uniquement une fois sortis de la boucle, retourner cet arraylist!

  10. #10
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Euh, je dois pas bien comprendre alors...
    Je vois plusieurs possibilités :
    • Soit la requête
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      "SELECT distinct(IMM_V_NUM_IMM)"
                 +" FROM   D_ASS"
                 +" WHERE  TEV_C_EVOP    LIKE '21%' "
                 +"AND    TPR_C_PREST   IN ('AE','AM','AN','AR','AA') "
      renvoi plusieurs résultats et il suffit de le modifierle code proposé par billynirvana en :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      List listfam = new ArrayList();
      
      			while(rs.next() && listfam == null) {
      				imma = rs.getString("IMM_V_NUM_IMM");
      				listfam.addAll(GetFamille(imma));
      			}
    • soit c'est GetFamille qui renvoi plusieurs résultats et dans ce cas le code de billynirvana est OK


    Et de toutes façon, une méthode ne renvoi toujours qu'un seul objet (qui peut être une liste).

  11. #11
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Dans mon expérience, ça rend le code rapidement illisible, avec des blocs de if / else immenses pour vraiment rien.
    D'ailleurs, les classes de l'API Java ne sont pas du tout implémentées comme ça. Il suffit d'aller regarde à peu près n'importe quelle méthode equals, par exemple. Et franchement, je trouve ça tellement plus intuitif : quand on a déterminé un résultat, on sort.
    Si une méthode est bourrée de if then else en cascade, que le return soit fait à chaque test ou uniquement à la fin c'est illisible dans les deux cas. Ce n'est pas le return qui est en cause en fait, c'est une erreur de conception/codage. Bref on s'écarte de la question initiale.

    Pourquoi ta méthode ne retourne-t-elle pas une List<List> ? Cela pourrait éventuellement répondre à ta problématique.

    Edit: De toute façon, tant qu'on saura pas ce que retourne GetFamily on pourra pas vraiment répondre car on ne sait pas ce que contient l'ArrayList.

  12. #12
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut Probléme de retour d'un type ArrayList dans une méthode JAVA
    Je crois que j'ai pas tout mentionné ,l'idée en fait c'est d'avoir des threads dans mon programme JAVA ,donc des traitement simultané ,une partie qui fait du select et l'autre fait du insert ,je veux optimiser le maximum le temps d'exécution cela en utilisant la programmation concurrente.

    Au départ j'avais utilisé la programmation simple avec des méthodes simple qui retourne un seule fois,le programme s'exécute dans une période considérablement énorme,ceci ma poussé vivement à trouver d'autre piste d'où vient l'idée de travailler avec des thread.

    Dans mon code j'ai un select que je doit pas laissé terminé pour insérer tout à la fois.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    requete="SELECT distinct(IMM_V_NUM_IMM)"
               +" FROM   D_ASS"
               +" WHERE  TEV_C_EVOP    LIKE '21%' "
               +"AND    TPR_C_PREST   IN ('AE','AM','AN','AR','AA') ";
                ps=conn.getConnexion().prepareStatement(requete);
                ps.setDate(1, sqlDate);
                rs=ps.executeQuery();
    la lsite de retour contient des objets je l'ai mis dans le while pour passer la liste au retour tant qui ya un seul élément,et tant qu'il ya ddes record j'exécute le while et je "retourne" en fin c'est l'idée.
    Et sachant que l'insertion je là fait dans une autre class qui prend la liste en entrée ,cette class doit s'exécuter en parallèle de la class de selection .
    J'espére que je vous ai mis dans le bain.
    TRÈS CORDIALAMENT

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    que vous utilisiez plusieurs thread ou un seul n'y change rien, un thread est une unité d'exécution, votre méthode est appelée dans le cadre d'une unité d'exécution. Si vous voulez paralléliser votre opération, vous devrez avoir un méthode du style


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List RecupFam(int from, int to){
     
       //récupérer les données dans le range cité de la DB
    }
    et avoir chaque thread qui appel avec des from/to différent pour répartir sur l'ensemble des données. Bref, chaque appel retourne 1 seul fois!

  14. #14
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut Probléme de retour d'un type ArrayList dans une méthode JAVA
    La situation est :

    J'ai une requête select qui me retourne plusieurs lignes, je parcours les lignes avec un curseur java (while ....).

    J'ai une autre Class qui récupère les lignes sélectionner et les insères dans une autre table.

    Problème: je veut insérer les lignes récupérer parallèlement à la sélection, avec des thread ,donc je doit pas attendre mon curseur finir le parcours de toutes les lignes sélectionnés et après retourner puis insérer , dans ce que je gagnerai rien en matière de temps.

    Si quelqu'un me donne une piste je serai très reconnaissant ,je suis planté la dessus .

  15. #15
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    A mon avis ce qu'il te faut c'est une Queue partagé par tes deux thread (et donc synchronisé)
    Le Thread qui fait les select ajoute les éléments dans ta queue et l'autre thread consome ce qu'il y a dedans au fur et a mesure.

    Pour résumé, il s'agit de mettre un place un pattern producteur/consomateur à l'aide d'un Queue (plus précisément, une BlockingQueue)
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'abord: même base de données? Si oui, il est en général beaucoup plus rapide de ne pas faire transiter les données par l'application et de directement construire une requete SQL qui fait un transfert d'un table à l'autre


    sinon, pour travailler avec des thread, il faut complètement revoir votre manière de faire.

    Vous devez avoir un Thread 1, appelons le Lecture. C'est une classe qui étends soit Thread, soit Runnablea, peu importe. Ce thread, dans sa méthode "run", va lire la base de donnée, et pour chaque Row lu, ajouter une entrée dans un BlockingQueue<> java (exemple une ArrayBlockingQueue)
    Dans un autre thread, écriture, il y aura cette même BlockingQueue<>. Dans la méthode run(), lire un à un les éléments de cette BlockingQueue pour les traiter.
    ainsi, vous aurez deux thread qui tournent en // et qui se "parlent" via la Queue.

    Exemple basique avec une queue limitée à 5 élément max et deux threads qui vont à des vitesses différentes:


    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
    package be.test;
     
    import java.util.Random;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
     
    public class TestQueue {
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		final BlockingQueue<String> queue= new ArrayBlockingQueue<String>(5);
    		Runnable ecriture = new Runnable() {			
    			@Override
    			public void run() {
    				Random r = new Random();
    				for (int i=0;i<40;i++){
    					try {
    						queue.put("Element "+i);
    						System.out.println("ajouté élément "+i);
    						Thread.sleep(r.nextInt(200)); // sleep entre 0 et 100ms aléatoire
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					} 
    				}				
    			}
    		};
    		Runnable lecture = new Runnable() {			
    			@Override
    			public void run() {
    				Random r = new Random();
    				for (int i=0;i<40;i++){
    					try {
    						System.out.println("lu: "+queue.take());
    						Thread.sleep(r.nextInt(300)); // sleep entre 0 et 300ms aléatoire
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					} 
    				}				
    			}
    		};
    		new Thread(ecriture).start();
    		new Thread(lecture).start();
    	}
     
    }
    avec sa sortie:
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    ajouté élément 0
    lu: Element 0
    ajouté élément 1
    ajouté élément 2
    ajouté élément 3
    lu: Element 1
    ajouté élément 4
    ajouté élément 5
    ajouté élément 6
    lu: Element 2
    lu: Element 3
    lu: Element 4
    ajouté élément 7
    ajouté élément 8
    ajouté élément 9
    lu: Element 5
    lu: Element 6
    ajouté élément 10
    lu: Element 7
    ajouté élément 11
    ajouté élément 12
    lu: Element 8
    ajouté élément 13
    lu: Element 9
    ajouté élément 14
    lu: Element 10
    ajouté élément 15
    lu: Element 11
    ajouté élément 16
    lu: Element 12
    ajouté élément 17
    lu: Element 13
    ajouté élément 18
    lu: Element 14
    ajouté élément 19
    lu: Element 15
    ajouté élément 20
    lu: Element 16
    ajouté élément 21
    lu: Element 17
    ajouté élément 22
    lu: Element 18
    ajouté élément 23
    lu: Element 19
    ajouté élément 24
    lu: Element 20
    lu: Element 21
    ajouté élément 25
    lu: Element 22
    ajouté élément 26
    lu: Element 23
    ajouté élément 27
    lu: Element 24
    ajouté élément 28
    ajouté élément 29
    lu: Element 25
    ajouté élément 30
    lu: Element 26
    ajouté élément 31
    lu: Element 27
    ajouté élément 32
    lu: Element 28
    ajouté élément 33
    lu: Element 29
    ajouté élément 34
    lu: Element 30
    ajouté élément 35
    lu: Element 31
    ajouté élément 36
    lu: Element 32
    ajouté élément 37
    lu: Element 33
    lu: Element 34
    ajouté élément 38
    ajouté élément 39
    lu: Element 35
    lu: Element 36
    lu: Element 37
    lu: Element 38
    lu: Element 39

  17. #17
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    Merci beaucoup pour vos réponse l'idée d'une queue m'a été très bénéfique,je l'ai implémenté et ça marche très bien,le seul problème que j'ai c'est le fait que je sais pas au préalable le taille de ma queue et par conséquent le nombre d'itération pour parcourir cette queue ,j'ai le thread qui fait la lecture depuis la queue qui se plante après la première lecture ,sachant que le premier thread fait une ecriture dans la queue par les données récupéré par une requéte SELECT, j'ai essayé de récupéré le nombre des lignes retourné par la requête, mais j'ai le ResultSet est de type TYPE_FORWARD_ONLY, donc je peux pas utiliser le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    resultat.last();
    //on récupère le numéro de la ligne
    int nombreLignes = resultat.getRow();
    Donc je suis à nouveau planté

    Vos idée sont les biens venues

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le plus simple est de mettre un marqueur (pas null!) dans ta queue quand tu as fini, marqueur que tu reçois de l'autre coté et qui t'informe que plus rien n'arrivera dans la queue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class TransfertObjectAMoi{
      public static final TransfertObjectAMoi END_OF_QUEUE = new TransfertObjectAMoi();
     
     
      // plein de données aussi, sert à contenir le resultat d'un ROW
    }
    puis à l'ecriture quand t'es à la fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    queue.put(TransfertObjectAMoi.END_OF_QUEUE);
    et à la lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while(true){
    TransfertObjectAMoi trans = queue.take(); // jeu de mot!
    if (trans!=TransfertObjectAMoi.END_OF_QUEUE){
       // traiter la ligne
    } else {
       // a y est, fini
       break;
    }
    }

  19. #19
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    c'est nickel ,merci bcp tchize_,sauf que j'ai fait un petit changement dans ton code en mettant à la fin du fameux queue un string à la place d'un object de la class ,car quand j'ajoute un objet il me donne erreur.
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    queue.put("end_queue");
    J'ai aussi un souci a propos de la taille du queue spécifié en début.
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final BlockingQueue<String> queue= new ArrayBlockingQueue<String>(5);
    est ce que je peux déclarer un BlockingQueue sans spécifié sa taille.

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il suffit de lire la doc http://download.oracle.com/javase/1....kingQueue.html

    pour voir que non.
    Et pour cause, sinon on risquerait de faire péter la mémoire en y stockant tout, ce qui étranglerait l'application et n'est pas le but recherché

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. arrayList dans une méthode recupérer dans une autre méthode
    Par toufik34 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 31/07/2013, 09h45
  2. Variable de type string dans une méthode
    Par bubblebe dans le forum Débuter
    Réponses: 6
    Dernier message: 16/08/2011, 20h34
  3. Réponses: 1
    Dernier message: 22/03/2010, 15h40
  4. Réponses: 1
    Dernier message: 18/08/2008, 14h08
  5. Réponses: 1
    Dernier message: 16/03/2007, 11h46

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