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

Concurrence et multi-thread Java Discussion :

Je n'arrive pas à faire sans stop() pour un thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Points : 54
    Points
    54
    Par défaut Je n'arrive pas à faire sans stop() pour un thread
    Bonjour.
    je travaille actuellement sur une application utilisant le moteur de recherche lucene.
    Je voulais mettre au point une espéce de timeout pour interrompre les requetes qui prennent trop de temps.
    Pour cela j'ai mis ma fonction qui fait la recherche dans un thread et j'interromp le thread avec la méthode stop au bout d'un certain temps si je n'ai pas eu de réponse. Cela fonctionne très bien.
    Mais d'après ce que j'ai pu lire ici la méthode stop n'est pas conseillé du tout...
    Mais je ne vois pas trop comment faire autrement.

    Voila un extrait de mon code :

    Le bean où je lance ma recherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SearchThread ThSearch = new SearchThread(lQuery,lSearcher);
    ThSearch.start();
     Hits lHits = rechercheTimeOut(10000,ThSearch);
    la fonction rechercheTimeOut
    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
     
    public Hits rechercheTimeOut(int timeur, SearchThread ThSearch) {
       Hits lHits;
       int TestFin = 0;
       Object o=new Object();
       long time = System.currentTimeMillis();
       while ((time + timeur > System.currentTimeMillis() && (TestFin == 0)) ) {
          try { synchronized(o) { o.wait(10); } } catch(InterruptedException ex) { }
          TestFin = ThSearch.getTestFin();
       }
     
       TestFin = ThSearch.getTestFin();
       if (TestFin == 0) {
          lHits=null;
          ThSearch.stop();  //attention : potentiellement dangereux, à voir si méthode plus élégante
       }else{
          lHits=ThSearch.getHits();
          ThSearch.Reprendre();
       }
       return(lHits);
    }
    Et enfin le run de mon thread :
    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
     
    int Attente;
    public void run() {
      try {
        lHitsRetour=this.cherche(critere,typeTri);
        TestFin=1;
        while(Attente==1) sleep(1);
       } catch( Exception e ) {
          System.out.println("InterruptedException 1, exception du run :"+e);	
       }
    }
     
    public void Reprendre() {
       Attente =0;
    }
    public int getTestFin() {
       return(TestFin);		    		
    }
    public Hits getHits() {
       return(lHitsRetour);		    		
    }
    Je fais appel au search de lucene dans ma fonction cherche().
    Aucun des deux squelettes dans la faq ne peuvent aller car en fait il n'y a que l'instruction search de lucene qui met du temps à s'executer et c'est l'execution de cette instruction que j'interromps en fait.

    Si vous connaissez une meilleure solution (sans modifier le code de lucene) je suis preneur.

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Cela m'étonne que les développeurs de Lucene n'aient pas prévu ce cas là... Leur méthode ne renvoie-t-elle pas un InterruptedException (auquel cas il serait possible de faire un interrupt) ; n'y a-t-il pas un Output/InputStream (auquel cas il serait possible de fermer le port).

    Et puis la recherche dans un moteur de recherche est une opération censée être rapide, non ? Quelle est cette recherche qui dure longtemps ?

  3. #3
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Et bien des recherches avec le caractéres * ou bien quand je demande tout les enregistrements en effectuant un tri (il ya aussi le cas de recherche croisé, on doit cherche dans un 1er index et les résultats permettent de rechercher dans un autre index)
    Il y a 4 millions de résultat à trier quand je demande tout et ca prend un peu moins de 10 sec sur ma machine (donc moins sur le serveur, enfin expérons)
    Mais je veux surtout prévoir le truc en cas de monté en charge (évidemment ca ne concerne que 1% des recherches et encore... mais bon j'essaye de le prévoir quand meme)

    J'avais posé la question il y a longtemps sur la mailing liste de lucene pour interrompre une recherche et on m'avait dit d'utiliser les threads.
    Je vais regarder pour le InterruptedException.

    edit : la méthode search de lucene ne renvoie qu'un IOException.
    J'utilisais l'ioexception avant en fermant le searcher avant la fin de la recherche mais depuis j'ai changé mon code et j'utilise le meme searcher pour toutes mes recherches en initialisant le searcher au lancement du serveur et non plus quand un utilisateur fait une recherche. Maintant j'ai un searcher permanent par indexes au lieu d'avoir un searcher par recherche en cours.
    Utiliser un searcher par recherche en cours m'évitait d'utiliser le stop() mais utiliser un searcher permanent par index permet d'avoir un sacré gain de performance.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/02/2007, 16h22
  2. Une requête que je n'arrive pas à faire
    Par Denti-fritz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/12/2005, 14h53
  3. Très débutant : je n'arrive pas à faire fonctionner le JDK
    Par miltonis dans le forum Général Java
    Réponses: 20
    Dernier message: 19/10/2005, 22h20
  4. [RegEx] je n'arrive pas à faire deux regex(s?)
    Par sloshy dans le forum Langage
    Réponses: 5
    Dernier message: 17/10/2005, 17h21
  5. Réponses: 10
    Dernier message: 17/10/2005, 12h07

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