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

avec Java Discussion :

[Débutant]Utilisation des Threads


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut [Débutant]Utilisation des Threads
    Bonjour à tous, voila je suis actuellement en stage dans une boite pour laquelle j'essaye de réaliser une petite appli qui fait des requêtes sur des serveurs.

    J'ai fait un fichier xml dans lequel on retourouve pour chaque élément serveur, une liste d'url et les paramètres de connexion à une base de donnée ainsi qu'une requêtes sql.
    Lorsque j'exécute mon appli, je teste les urls ( et la base correspondante si une des url renvoit une erreur de type 40x ou 50x)

    Mon problème est que j'aimerais pouvoir mettre en pause les requêtes sur un serveur et continuer à tester les autres. J'ai regardé beaucoup de doc sur les Thread, je pense avoir compris le fonctionnement mais je n'arrive pas à les utiliser correctement pour mon appli. Voila cela fait deux semaine que j'essaye sans succès voici ma classe principale si vous pouvez m'aider...

    public class Main{

    static ServerParameters srvParam = null;
    String nomServer = null;
    String nomDataBase = null;
    String reponseResultUrl = null;
    String reponseResultDb = null;
    ResultParameters resultUrl = null;
    ResultParameters resultDb = null;
    ArrayList listUrl = null;
    ServerListXml svrXml = new ServerListXml();
    Timer t = null;
    ArrayList listeSrvParameter = svrXml.getListeServerXml();
    Calendar calender = null;
    ArrayList reponseKo = null;
    ReponseKoParameter reponseKoParam = null;
    String repDb = null;

    public Main(ServerParameters srvParam) {

    Main.srvParam = srvParam;
    t=new Timer();
    t.schedule(new Repet(), 0, 600);
    }


    class Repet extends TimerTask {

    public void run() {

    calender= Calendar.getInstance();
    reponseKo = new ArrayList();
    for (int i = 0; i < listeSrvParameter.size(); i++)
    {
    srvParam = (ServerParameters)listeSrvParameter.get(i);
    listUrl = srvParam.getListeUrl();

    nomServer= srvParam.getServerName();
    nomDataBase = srvParam.getDbParameters().getDbType();
    System.out.println("Test du serveur " + nomServer);

    for (int j = 0; j < listUrl.size(); j++ )
    {
    resultUrl = CheckUrl.checkUrl((UrlParameters)listUrl.get(j));
    reponseResultUrl = resultUrl.getCodeReponse();

    String logResultUrl = "Connexion à l'Url " + resultUrl.getNomDuTest();
    String logReponseUrl = "resultUrl : " + reponseResultUrl + "\n";
    System.out.println(logResultUrl);
    System.out.println(logReponseUrl);

    if(!(reponseResultUrl.equals("OK")))
    {
    String repServerName = "\r\n" + "============== " +" alerte "+ ", serveur " + nomServer +" =============="+ "\r\n";
    String repUrl = calender.getTime() +"\t"+ logResultUrl +"\t"+ logReponseUrl;
    try {
    resultDb =
    CheckDataBase.checkData(srvParam.getDbParameters());
    } catch (SQLException e) {
    e.printStackTrace();
    }
    reponseResultDb = resultDb.getCodeReponse();
    String logResultDb = "Test de la Base " +nomDataBase+ " " +
    resultDb.getNomDuTest();
    String logReponseDb = "resultDB : " + reponseResultDb + "\n";
    System.out.println(logResultDb);
    System.out.println(logReponseDb);

    if(!(reponseResultDb.equals("OK")))
    {
    repDb = calender.getTime()+"\t"+ logResultDb +"\t"+
    logReponseDb;
    }
    reponseKoParam = new ReponseKoParameter(repServerName,repUrl,repDb);
    reponseKo.add(reponseKoParam);
    }
    }

    for(int m = 0; m < reponseKo.size(); m ++)
    {
    reponseKoParam = (ReponseKoParameter)reponseKo.get(m);
    LogSentinelle.ecrire(reponseKoParam.getServerNameKo());
    LogSentinelle.ecrire(reponseKoParam.getUrlReponseKo());
    LogSentinelle.ecrire(reponseKoParam.getDbReponseKo());
    }
    }
    }
    }

    public static void main(String[] args)throws Exception{
    Main repet = new Main(srvParam);

    }
    }


  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    Bonjour,
    Dans ton code il n'y apparemment que 2 thread.
    Le thread principal (main) qui ne fait rien, le thread de l'execution de TimerTask.

    La méthode run est exécutée par le thread TimerTask a cadence fixe. Il n'y a pas de parallellisation des traitements.

    Qu'est ce que tu veux paralleliser ?

  3. #3
    Membre régulier
    Profil pro
    Abcde
    Inscrit en
    Août 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Abcde
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2004
    Messages : 59
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par maniolo
    Bonjour à tous, voila je suis actuellement en stage dans une boite pour laquelle j'essaye de réaliser une petite appli qui fait des requêtes sur des serveurs.

    pourquoi ecrire une appli qui fait ca ? il en existe plein.

    essaye donc JMeter chez apache

    @+

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut
    j'aimerais pouvoir faire une sorte de multi-threadring si je ne dis pas de bêtise, par exemple si mes requêtes sur un serveur renvoient la réponse "KO" je fait une pause sur les requêtes de ce serveur pour le prochain passage dans la boucle et je passe aux tests des autres serveurs. il faudrait en fait paralleliser les tests sur chaque élément serveur, le problème est que ma boucle test un serveur après l'autre et si je met un thread dans ma boucle avec la méthode wait() par exemple, la boucle s'arrete un temps donné et ne passe pas au test suivant.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par yopiyop
    pourquoi ecrire une appli qui fait ca ? il en existe plein.

    essaye donc JMeter chez apache

    @+
    C'est pas moi qui ai choisi, c'est la boite dans laquelle je fait le stage qui m'a demandé...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    Il faut donc paralleliser les appels à TimerTask

    Je suppose qu'en créant autant de timer que de serveur alors ton Repet.run sera traité dans des threads différents
    (facilement a tester, tu rajoutes un print de Thread.getCurrentThread().getName() dans la methode Repet.run pour savoir dans quel thread tu te trouves)

    Pour démarrer tes timers :

    for (int j = 0; j < listUrl.size(); j++ )
    {
    t=new Timer();
    t.schedule(new Repet((UrlParameters)listUrl.get(j)), 0, 600);

    }

    en passant au constructeur de Repet l'url sur laquelle il travaille

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut
    Merci pour tes réponses, je crois comprendre le principe , cependant j'ai deux questions bêtes...

    Citation Envoyé par manitoba
    Pour démarrer tes timers :

    for (int j = 0; j < listUrl.size(); j++ )
    {
    t=new Timer();
    t.schedule(new Repet((UrlParameters)listUrl.get(j)), 0, 600);

    }
    dois-je le placer ceci le constructeur de ma classe Main et si oui ne vais-je pas avoir un javanullpointerexception? comme ceci :
    public MainSentinelle2(ServerParameters srvParam) {
    MainSentinelle2.srvParam = srvParam;
    for (int j = 0; j < listUrl.size(); j++ )
    {
    t=new Timer();
    t.schedule(new RepetSentinelle((UrlParameters)listUrl.get(j)), 0, 600);
    }
    }
    Citation Envoyé par manitoba
    en passant au constructeur de Repet l'url sur laquelle il travaille
    La je comprend pas trop... Repet est la méthode que j'exécute dans mon Main, je dois lui créé un constructeur ?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    Citation Envoyé par maniolo
    dois-je le placer ceci le constructeur de ma classe Main et si oui ne vais-je pas avoir un javanullpointerexception?
    Non ya pas spécialement de raison
    Par contre ton constructeur de MainSentinelle est bizarre.
    Pourquoi, MainSentinelle.srvParam = srvParam

    Citation Envoyé par maniolo
    La je comprend pas trop... Repet est la méthode que j'exécute dans mon Main, je dois lui créé un constructeur ?
    Repet est pas une méthode c'est une classe.
    voir ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Class Repet implements Runnable { 
    ...
    public void run() {
    ....}
     
     }
    il faut simplement que tu lui ajoutes un membre d'instance (a ne pas déclarer en static)

    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
    Class Repet implements Runnable { 
     
    UrlParam _urlServeur;
     
    public Repet(UrlParam url)
    {
      _urlServeur = url;
    }
    ...
    public void run() {
     
       // Je fais mon traitement en utilsant _urlServeur
    ....}
     
     }

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut
    en fait j'ai une classe ServerListXml qui récupère le contenu de mon fichier xml
    et qui passe en paramètre les valeurs à la classe ServerParameters qui sont ensuite stockées dans une Arraylist comme ceci :
    serverParameter = new ServerParameters(serverName,dbParameters,listeUrl);
    listServer.add(serverParameter);
    je passe comme parametre au constructeur de ma classe principale
    la classe ServerParameter qui est elle-même un constructeur de cette forme
    public class ServerParameters {
    String serverName;
    DbParameters dbParameters;
    ArrayList listeUrl;

    public ServerParameters(String serverName, DbParameters dbParameters, ArrayList listeUrl) {
    this.serverName = serverName;
    this.dbParameters = dbParameters;
    this.listeUrl = listeUrl;
    }
    avec des getters et des setters
    Dans la classe principale j'appelle une classe CheckUrl (dans laquelle je passe en parametre Urlparameter) qui me sert à effectuer les tests des url et qui retourne un resultat ok ou ko
    if(ok){
    result = new ResultParameters(urlParameters.getUrlName(),"OK"); }
    else{
    result = new ResultParameters(urlParameters.getUrlName(),"KO"); }
    return result;
    }
    la classe Urlparameter à cette forme

    public class UrlParameters {
    private String url;
    private String urlName;

    public UrlParameters(String url,String urlName){
    this.url = url;
    this.urlName = urlName;
    }
    avec des getters et des setters
    Cela fait 4 mois que je travaille dessus, et cela fait également 4 mois que j'apprends java...
    J'ai essayé de placer la boucle qui créé les timers dans le constructeur de ma classe main mais j'ai bien un javanullpointerexception...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut
    ...

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    Sur l'exception je peux pas trop d'aider

    La trace de l'exception doit pouvoir de dire ou ca coince (normalement tu a le numéro de ligne ), ou utilises un debugger.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut
    J'ai donc fait ceci :
    public Main(ServerParameters srvParam) {
    Main.srvParam = srvParam;
    for (int i = 0; i < listeSrvParameter.size(); i++)
    {
    srvParam = (ServerParameters)listeSrvParameter.get(i);
    listUrl = srvParam.getListeUrl();

    for (int j = 0; j < listUrl.size(); j++ )
    {
    t=new Timer();
    t.schedule(new Repet((UrlParameters)listUrl.get(j)), 0, 600);
    }
    }
    }
    class Repet extends TimerTask {

    UrlParameters _urlServeur;

    public RepetSentinelle(UrlParameters url)
    {
    _urlServeur = url;
    }
    Lorsque j'exécute il me créé autant de timer que j'ai d'url mais les requêtes s'exécute de façon aléatoire, sinon je ne vois pas comment dois-je utiliser _urlServeur dans ma méthode run()?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut
    J'aimerais savoir comment puis-je mettre en pause un des thread, j'ai essayé ceci dans ma méthode run() :

    if(!(reponseResultUrl.equals("OK")))
    {
    try {
    t.wait(10000);
    } catch (InterruptedException e1) {
    // TODO Bloc catch auto-généré
    e1.printStackTrace();
    }
    mais j'ai comme erreur :
    java.lang.IllegalMonitorStateException: JVMLK010: current thread not owner
    at java.lang.Object.wait(Native Method)
    at sentinelle.appli.MainSentinelle2$RepetSentinelle.run(MainSentinelle2.java:89)
    at java.util.TimerThread.mainLoop(Timer.java:445)
    at java.util.TimerThread.run(Timer.java:395)

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    Citation Envoyé par maniolo
    J'ai donc fait ceci :

    Lorsque j'exécute il me créé autant de timer que j'ai d'url mais les requêtes s'exécute de façon aléatoire, sinon je ne vois pas comment dois-je utiliser _urlServeur dans ma méthode run()?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    run()
    {
     
       resultUrl = CheckUrl.checkUrl(_urlServeur );
       reponseResultUrl = resultUrl.getCodeReponse();
     
    }

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    pour le côté aléatoire ... met de la trace sur la sortie standard avec le nom du thread (cf Thread.getCurrentThread().getName()) et la date et l'heure.
    Histoire de bien comprendre ce qui se passe

    Pour endormir ton thread 10 secondes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(!(reponseResultUrl.equals("OK")))
    {
    try {
    // Endors le thread courant pendant 10 sec.
    Thread.sleep(10000);
    } catch (InterruptedException e1) {
    // TODO Bloc catch auto-généré
    e1.printStackTrace();
    }



    Un tutoriel chez Sun sur les timers : http://java.sun.com/docs/books/tutor...ads/timer.html

    Et lire aussi voir les tutoriels et cours de formation pour apprendre Java : http://java.developpez.com/cours/

  16. #16
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Pour vous tous, est-il possible d'utiliser la balise [code] et de faire un effort pour formater votre code, merci.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    désolé d'habitude c'est Eclipse qui fait le boulot.
    Vivement le shift+Ctrl+F sur developpez.com


    (allez promis on fera un effort)

  18. #18
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Tu sais je m'en moque je ne répond pas à ce post, mais si jamais des gens veulent de creuser la tête c'est pas facile...

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    Citation Envoyé par thibaut
    Tu sais je m'en moque je ne répond pas à ce post, mais si jamais des gens veulent de creuser la tête c'est pas facile...
    Pas de problème
    C'est toi qui as raison

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Points : 66
    Points
    66
    Par défaut
    beaucoup manitoba pour ton aide précieuse cela semble fonctionner. je laisse cependant mon post en non résolu pour l'instant , car j'essaye de bien comprendre le fonctionnement. Mon appli a gagné en rapidité, c'est impressionant, les requêtes vont très vite, je ne comprend pas encore vraiment pourquoi elles s'exécutent quand bon leur semble , j'imagine qu'il faut les synchroniser, en tout cas merci encore !

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

Discussions similaires

  1. [+ou- débutant] utilisation des sémaphores
    Par Biosox dans le forum Windows
    Réponses: 4
    Dernier message: 26/05/2008, 12h23
  2. Avis sur la bonne utilisation des Threads
    Par Pitivier dans le forum Général Java
    Réponses: 8
    Dernier message: 28/11/2006, 20h07
  3. connexion socket utilisant des threads
    Par alceste dans le forum C++
    Réponses: 16
    Dernier message: 14/10/2006, 12h00
  4. Utilisation des threads
    Par Valinor dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2005, 16h41
  5. Utilisations des Threads
    Par phoenix440 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/08/2005, 17h19

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