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 :

Thread créé à la volée


Sujet :

avec Java

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut Thread créé à la volée
    Bonjour,

    J'ai un code qui doit faire des transferts de données de manière régulière. Les transferts sont lancés dans un thread créé à la volée pour ne pas ralentir les entre taches prioritaires.
    Néanmoins j'ai des erreurs qui apparaissent et qui me font un peu peurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IO Thread[Thread-24458,5,main] Connection reset
    L'erreur vient d'un problème de transmission. Le code au bout d'un certain temps coupe le transfert et relance si aucune exception n'est levée.

    Le numéro du thread va forcément diverger; est ce normal ?

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Thread Thread_transfert = null;
    ......
     
    if(!Thread_transfert.isAlive())
    {
    Thread_transfert = null;
    Thread_transfert = new Thread(new Runnable(){public void run(){transfert_data(data);}});
    Thread_transfert.start();
    }
    else{.....}
    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par philippe13 Voir le message
    Le numéro du thread va forcément diverger; est ce normal ?
    C'est normal puisque tu en crées un nouveau à chaque fois, mais il faudrait pas.
    Un pool de thread, avec une taille maximum de threads possible, serait mieux.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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
    ce qui me fait peur c'est que tu en soit à ton 24.000ième thread

    Comme dit thelvin: un ThreadPool et un une DeQueue pour stocker les tâches, et c'est réglé, un seul groupe de thread ad-vitam.

  4. #4
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    merci de vos réponses.
    je vais faire ce que m'a dit thelvin.

    Par contre est ce que vous pouvez me dire la différence avec ce type de code :
    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
    btnAction.addActionListener(
      new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          // création d'un thread d'exécution
          thread t = new thread() {
            public void run() {
              // Instanciation et lancement du traitement
              LongAction action = new LongAction();
              action.traitementLong(jBar);
            }
          };
          t.start();
        }
      }
    );
    là aussi le thread est généré à la volée, non ?

    Le code vient de ce lien : http://alwin.developpez.com/tutorial/JavaThread/

    Pour moi c'était un peu la même démarche.


    Merci encore.

  5. #5
    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
    Oui, mais là on a un Thead qui est lancé par un bouton. Il y a peu de chance de lancer 50 threads par seconde

    Ici tu veux faire une tache régulière, donc il est préférable d'avoir un executor en attente sur ces tâches.

  6. #6
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    Les 25000 threads ne sont pas actifs en même temps. C'est juste leur "numéro" d'identification. Une fois qu'un thread a fini sa tache le garbage collector fait le ménage. Enfin c'est ce qu'il me semblait. D'ailleurs je ne comprends pourquoi il n'y a pas une remise à zéro de l'identifiant.

    Merci pour vos réponses

  7. #7
    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
    oui, je suis d'accord, le threads sont nettoyés. Ca n'en reste pas moins un sacré quantité. Evidement, si ça représente un run de 1 mois, ce n'est pas la même chose que un run de 1h

    Ce qui est important c'est d'éviter d'en créer beaucoup en peu de temps, parce que c'est du temps et des ressources gaspillées.

    Le numéro n'est pas récupéré parce que ça n'a aucun intérêt en pratique et que ce serait beaucoup plus compliqué à gérer

  8. #8
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    y a t il un nombre limite ?

    Merci pour les éclaircissements.

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    En théorie oui, en pratique le microprocesseur fondra bien avant d'atteindre ce nombre.

    Par contre, si tu ne limites pas le nombre de threads que tu laisses fonctionner en même temps, cela peut avoir de sérieux impacts sur les performances, et sur la capacité à ton programme de continuer à fonctionner du tout.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    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
    Citation Envoyé par philippe13 Voir le message
    y a t il un nombre limite ?
    En même temps oui.

    Un Thread a besoin d'un Stack et occupe du temps sur le micro-processeur. Ca consomme aussi du temps pour le micro processeur de passer d'un thread à un autre quand il y a plus de thread dans le système que de core. Donc si tu met 500 threads qui tournent à 100% CPU sur un proco quad core. Il va passer plus de temps à faire du context-switching que d'exécuter ce que demandent les threads
    Concernant la Stack, en 64 bits, elle occupe 1M / thread. Ca veux dire que si tu as 500 threads qui tournent (running ou pause), tu occupe d'office 500Mb dès le départ. Là t'as encore aucune donnée


    L'un après l'autre, non, ça ne consomme pas particulièrement. C'est juste que la création d'un Thread c'est consomateur. Alors si c'est pour en créer un toutes les 5 minutes, ça passe, l'impact n'est pas visible. Si c'est pour en créer 100 par secondes, c'est autre chose

  11. #11
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    merci pour vos réponses.

    En fait je n'ai pas 500 thread en même temps. J'ai gestionnaire de thread qui veille sur ton cela. C'est juste qu'à la fin du run je laissais mourrir le thread et en créé un nouveau suivant les besoins. Du coup maintenant, à la fin du run je le mets en sommeil et le ranime au moment où j'en ai besoin.

    Merci pour vos réponses.

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ok, mais pourquoi t'embêter alors que c'est exactement ce que fait un ThreadPoolExecutor ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    oui ça serait pas idiot
    merci pour la remarque.

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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