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 :

Arrêter 4 threads temporairement


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 62
    Par défaut Arrêter 4 threads temporairement
    Bonjour,

    J'ai une classe X qui etends la classe Thread. J'instancie 4 objets de ma classe X dont les threads principaux sont actifs.

    Lors d'un évenement Y, j'aimerais bloquer les 4 Threads pour les faire redémarrer plus tard.

    Quelqu'un peut-il m'aider ?

    Merci d'avance.

  2. #2
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut
    Par exemple : les threads lisent un Boolean et s'arrêtent quand celui-ci change d'état.

    Pour l'arrêt :

    return;
    OU
    sleep(xxxx);
    OU
    wait(xxxx);
    OU
    ...

    Nota : Parfois le système d'exploitation (que je ne citerais pas ) plante, et tous les petits threads de la machine s'arrêtent tout seuls.

    A+

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    while(!stopped){
       if(paused){
          this.yield(); // Cela donne la main aux autres threads.
       }
       else{
          // Les traitements lorsque le thread n'est pas en pause.
       }
    }

  4. #4
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    sauf erreur de ma part ça ne marche pas
    (problème des copies privées de la mémoire par les threads, voir les explications sur volatile)
    est-ce que le code mis ici http://www.developpez.net/forums/sho...d.php?t=221981 dans le post 15 te conviendrait?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Par défaut
    J'ai toujours fait comme iohack et jamais eû de problèmes, qu'est ce qui ne marche pas ?

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par iohack
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    while(!stopped){
       if(paused){
          this.yield(); // Cela donne la main aux autres threads.
       }
       else{
          // Les traitements lorsque le thread n'est pas en pause.
       }
    }
    Le yield() ne sert à rien... Il donne la main aux autres threads, mais qu'est-ce que ça change?
    "Tout programme qui fonctionne avec un yield() doit fonctionner tout aussi bien sans le yield()" (dixit mon prof de systèmes concurrents)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Par défaut
    Salut,
    Voici l'exemple que donne Sun pour remplacer l'usage des fonctions "resume" et "suspend" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void run() {
            while (true) {
                try {
                    Thread.currentThread().sleep(interval);
     
                    synchronized(this) {
                        while (threadSuspended)
                            wait();
                    }
                } catch (InterruptedException e){}            
            }
        }
    }

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Par défaut
    Citation Envoyé par ®om
    Le yield() ne sert à rien... Il donne la main aux autres threads, mais qu'est-ce que ça change?
    "Tout programme qui fonctionne avec un yield() doit fonctionner tout aussi bien sans le yield()" (dixit mon prof de systèmes concurrents)
    Oui le programme fonctionnera également sans le yield, mais il permet quand même de redonner la main plus rapidement aux autres threads, sans le yield il y a de fortes chances que le thread continue de boucler dans le while un bon nombre de fois avant de donner la main aux autres threads.
    La le "if(paused){" est tout en haut du run ce n'est pas trop grave car une boucle va très vite mais si tu as une opération entre le while et le if, ne pas mettre de yield peut augmenter significativement le temps d'éxécution.

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Kikito
    Oui le programme fonctionnera également sans le yield, mais il permet quand même de redonner la main plus rapidement aux autres threads, sans le yield il y a de fortes chances que le thread continue de boucler dans le while un bon nombre de fois avant de donner la main aux autres threads.
    La le "if(paused){" est tout en haut du run ce n'est pas trop grave car une boucle va très vite mais si tu as une opération entre le while et le if, ne pas mettre de yield peut augmenter significativement le temps d'éxécution.
    Donc le programme ne fonctionne pas correctement sans le yield() (boucle infinie à ne rien faire)... Il est incorrect...
    C'est pour ça qu'il ne faut pas utiliser de l'attente active mais de l'attente passive... Par exemple par un moniteur ou un sémaphore...

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  3. [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