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

Java Discussion :

Thread attendant les messages d'autres Thread


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut Thread attendant les messages d'autres Thread
    Bonjour à tous,

    Tout d'abord un rapide descriptif de la situation :
    • Je code un jeu en client-serveur.
    • Dans ce jeu, chaque Joueur (une classe), lorsqu'il se connecte au serveur, se retrouve dans la liste de Joueur du GameManager (une classe).
    • Le GameManager et les Joueur tournent chacun dans leur propre thread.
    • Donc si on a 4 joueurs connectés, on aura 4 + 1 (le GameManager) = 5 threads qui tournent.


    J'aimerais que le GameManager fasse la chose suivante :
    • Ne rien faire tant qu'un joueur ne l'a pas réveillé pour lui dire qu'il a changé d'état.
    • Lors du réveil par un joueur, exécuter des actions puis se rendormir jusqu'au prochain réveil


    Je me suis intéressé au pattern Observer pour résoudre mon problème.
    Celui-ci fonctionne très bien lorsque je n'ai qu'un thread, mais dès que j'essaye de l'adapter au multi-thread je me perds.

    Voilà comment j'ai pensé les choses :
    • Les Joueur sont IObservable
    • Le GameManager est un IObserver
    • Chaque joueur possède le GameManager dans sa liste d'IObserver


    En terme de code (simplifié) nous arrivons à la chose suivante :
    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 GameManager implements IObserver, Runnable {
      public void update() {
        // déclenchée lorsqu'un joueur réveille le thread
      }
     
      public void run() {
        // Boucle infinie se contentant d'attendre que le GameManager soit réveillé
        syncronized(this) {
          try {
            this.wait();
          }
          catch(...){...}
        }
      }
    }
    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 class Joueur implements IObservable, Runnable {
      // Les méthodes permettant de gérer les observeurs
      public void addObserver(IObserver o){...}
      public void removeObserver(Iobserver o){...}
     
      public void notifyObservers() {
        // Itération parmi les IObserver et appel de la méthode update() (de l'interface IObserver)
      }
     
      public void run() {
        // Attente de la réception d'un message sur son socket
        // Dès que le message arrive, appel de notifyObservers()
      }
    }
    Ce que j'aimerai, c'est que le GameManager se réveille lors de l'appel d'un joueur, puis se rendorme, puis se réveille lors de l'appel d'un joueur etc.

    Mais je ne sais pas où mettre les wait() et les notify() pour arriver à mes fins.

    Dois-je mettre le notify() (permettant "d'annuler" le wait()) dans le notifyObservers() de Joueur ? Directement dans le update() de GameManager ?

    Merci pour votre aide.

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    juste pour clarifier la situation. Tu utilises des sockets et tu crées un thread serveur par client connecté sur ta machine serveur ?
    Vive les roues en pierre

  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
    il faut bien etre conscient que, dans ton code, c'est le thread 'joueur' qui va exécuter le code de la méthode update. Ce n'est pas parce que tu appelle une méthode d'un objet Thread que c'est forcément ce thread qui exécute cette méthode. Dans ton manager, tu devrais donc avoir ce genre de code (grosso modo)

    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
     
    public void update(){
        synchronized(this){
            this.notify();
        }
    }
     
    ...
    public void run() {
        // Boucle infinie se contentant d'attendre que le GameManager soit réveillé
        syncronized(this) {
          try {
            this.wait();
            // faire avancer le jeu
          }
          catch(...){...}
        }
      }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Salut,
    juste pour clarifier la situation. Tu utilises des sockets et tu crées un thread serveur par client connecté sur ta machine serveur ?
    Oui c'est tout à fait ça.

    Citation Envoyé par tchize_ Voir le message
    il faut bien etre conscient que, dans ton code, c'est le thread 'joueur' qui va exécuter le code de la méthode update. Ce n'est pas parce que tu appelle une méthode d'un objet Thread que c'est forcément ce thread qui exécute cette méthode. Dans ton manager, tu devrais donc avoir ce genre de code (grosso modo)

    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
     
    public void update(){
        synchronized(this){
            this.notify();
        }
    }
     
    ...
    public void run() {
        // Boucle infinie se contentant d'attendre que le GameManager soit réveillé
        syncronized(this) {
          try {
            this.wait();
            // faire avancer le jeu
          }
          catch(...){...}
        }
      }
    En effet, j'ai maintenant bien intégré le concept.
    Et ce faisant, je me suis rendu compte de la chose suivante : le GameManager n'a aucun besoin d'être dans son propre thread car il ne contient aucun code bloquant.

    Donc finalement aucun besoin de wait() dans le GameManager.

    Merci pour votre aide.

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

Discussions similaires

  1. WPF et modification interface par un autre thread comme les WF ?
    Par Yogy dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 04/03/2009, 17h04
  2. Fichier ecrit par un Thread et lu par un autre Thread
    Par Fladnag dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/04/2004, 14h56

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