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 :

Arreter un thread qui "bloque" sur un socket


Sujet :

Concurrence et multi-thread Java

  1. #1
    J-F
    J-F est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Arreter un thread qui "bloque" sur un socket
    Bonjour,

    Je développe une petite application multi-threadée qui met en route un serveur TCP et "discute" avec des clients. J'ai donc un thread qui "bloque" sur un ServerSocket (le serveur) et d'autres threads qui "bloquent" (par exemple) sur un readLine() d'un BufferedReader tiré d'un socket. Le problème est simple: lorsque je souhaite quitter l'application, comment faire pour stopper proprement les thread? Evidemment, puisque les threads sont le plus souvent en état bloqué, je ne peux pas régulièrement tester la valeur d'un flag booléen (comme proposé ici: http://java.developpez.com/faq/java/...READ_terminer). J'ai pensé faire fermer tous les sockets par un thread extérieur: ça provoque une erreur I/O sur tous les threads qui se débloquent d'eux meme. Mais bon, c'est pas génial: les erreurs I/O sont rapportées à l'utilisateur alors qu'en fait, rien de grave se passe Alors comment faire?

  2. #2
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    Moi j'utilise toujours la fermeture du serveur, et je récupère l'erreur pour faire gaffe à ne rien faire.

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

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Personnellement, J-F je pense que c'est pas trop mal comme l'idée.
    Pour les IOErreur, tu peux gérer pour chaque un boolean "hasBeenTerminated" dont la gestion se ferait dans le catch. exemple :
    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
    21
    22
    23
    24
    25
    26
     
    public class MaClasse extends Thread{
       private boolean hasBeenTerminated=false;
       ...
       public void setTerminated(){ // appelé par le thread qui va décider de la fermeture
          this.hasBeenTerminated=true;
          this.fluxOut.close();
          this.fluxIn.close();
          this.socket.close();
       }
       ...
       public void run(){
          try{
             while(...){
                lireSocket()...
                ecrireSocket()...
             }
          }catch(IOException ioe){
             if(this.hasBeenTerminated){
                 // On ne faix exceptionnellement rien car l'erreur est "normale"
             }else{
                 // La on peux envoyer un message à l'utilisateur
             }
          }
       }
    }
    La je me mets au niveau du serveur. Ca pose problème si c'est le client qui est fermé de cette manière car le serveur va se bouffer une IOException lors de la fermeture du socket sur le "lireSocket()". Vu que c'est le client qui a la main ( c'est lui qui envoi les données en permier, et le serveur bloque sur la lecture ), la solution consiste à ce que le client envoie un utlime message du genre "EXIT" pour que le serveur ferme de lui-même proprepement la connexion.
    Maintenant ce cas peut-être vu dans le sens opposé, c'est le client qui attent en premier le message du serveur. Le choix de telle ou telle autre solution se fais d'un point de vue logique de ton application.

Discussions similaires

  1. Lancer un thread qui reste en écoute sur un port
    Par maestro_mirou dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 02/04/2012, 10h39
  2. thread qui se bloque sous linux
    Par killer Am dans le forum Linux
    Réponses: 1
    Dernier message: 25/08/2008, 21h36
  3. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 10h51

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