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 :

[Threads] Actions continues avec des threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut [Threads] Actions continues avec des threads
    Hello,

    Données du problèmes :
    -> je dois contrôler différents objets de manière continue au moyen de threads (programme tourne en boucle)
    -> je ne peux lancer qu'un nombre limité de threads
    -> les threads peuvent être lancés depuis les objets ou l'objet peut être un paramètre du thread, c'est à choix

    Exemple :
    -> j'ai 10 objets OBJ stockés dans un tableau TAB
    -> je ne peux avoir que 5 threads en même temps

    Ce que je pensais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (true) //pour tourner indéfiniment
            {
                for (int i = 0; i < 10; i++)
                {
                    threads thr = new threads(TAB[i]);
                }
            }
    Le problème est que je ne sais pas vraiment comment empêcher d'avoir plus de 5 threads à la fois. Il faudrait que lorsque le nombre maximal de threads a été atteind, le programme attend qu'un thread se termine pour lancer le suivant.

    Comment puis-je faire ça ?[/quote]

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Il te faut utiliser un sémaphore entier. Une rapide recherche n'a pas donné grand chose, je ne sais pas si ca existe en Java, mais tu peux le coder à partir des synchronisations synchronized{}.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Et bien tu gères un tableau des threads que tu as lancé, et tu vérifies s'ils ont terminé leur exécution :
    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
    Thread[] threads = new Thread[5];
     
    index = 0;
    while (true) {
      for (int i = 0; i < threads.length; i++) {
        if (threads[i] == null || !threads[i].isAlive()) {
          thread = new Thread(TAB[index]);
          index = (index + 1) % 10;
     
          threads[i] = thread;
          thread.start();
        }
      }
     
      // pour éviter de consommer trop de temps CPU
      try {
        Thread.sleep(50);
      } catch (InterruptedException ex) {
      }
    }

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Si tu utilises java 5.0 tu peux utiliser la nouvelle API de concurrence et les executeurs de tâches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ExecutorService executor = Executors.newFixedThreadPool(5);
    for (int i = 0; i < 10; i++) {
    	executor.execute(new threads(TAB[i]));
    }

    Sinon il va falloir gérer cela toi même, eventuellement en gérant des listeners qui avertiront ta classe principale lorsqu'un thread est terminé...

    a++

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    Merci, j'ai essayé le code d'hervé91, mais j'ai une erreur sur la ligne
    Erreur ->
    java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Native Method)
    at intrusion.testIntrusion.main(testIntrusion.java:86)
    Et je n'ai qu'un seul thread qui démarre. Faut-il définir un état particulier avant de lancer les threads ?

  6. #6
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Peux-tu poster le code complet de la boucle ?
    L'exception signifie que tu appelles deux fois la méthode start() sur une même instance de Thread.

  7. #7
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par herve91
    L'exception signifie que tu appelles deux fois la méthode start() sur une même instance de Thread.
    Bien vu, grâce à cette information j'ai trouvé où se trouvait l'erreur (en fait j'utilisais la méthode start() dans le constructeur du thread).

    Merci encore pour le code !

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

Discussions similaires

  1. Péage avec des Threads
    Par Invité dans le forum Concurrence et multi-thread
    Réponses: 20
    Dernier message: 20/06/2007, 14h35
  2. Problème avec des threads
    Par rajuto dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 11/02/2007, 20h41
  3. Réponses: 2
    Dernier message: 04/01/2007, 16h48
  4. Faire un sleep non blockant avec des threads
    Par mobscene dans le forum Langage
    Réponses: 7
    Dernier message: 15/12/2006, 19h31

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