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 :

Tuer un thread bloqué en lecture.


Sujet :

Concurrence et multi-thread Java

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Par défaut Tuer un thread bloqué en lecture.
    Bonjour

    Je cherche à tuer un thread java malgré le fait que celui-ci soit bloqué sur une opération d'E/S (Lecture dans un flux d'entrée). J'ai trouvé beaucoup de réponses sur le sujet mais aucune qui me convienne.
    Pour le moment j'ai redéfinit la méthode interrupt() pour qu'elle ferme le flux d'entrée. Malheureusement mon programme se fige après être entré dans la méthode interrupt() (Si vous regardez le code il affiche la string"avant" mais pas "apres").
    Pour le moment je ne vois aucune solution simple qui me permette de tuer le thread.
    Qualqu'un aurait-il une idée??

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    	public void run()
    	{
    		try
    		{
    			this.priseClient=new Socket(this.adresseIp,2007);
     
    			this.fluxOut=new PrintWriter(this.priseClient.getOutputStream());
     
    			this.fluxIn=new BufferedReader(new InputStreamReader(this.priseClient.getInputStream()));
     
    			while(true)
    			{
    				String messageServeur="";
     
    				if(ModeleClient.interrupted())
    				{
    					return;
    				}
    				//Méthode bloquante qui lit les les envois du serveur (rencoi null si rien n'est lu)
    				messageServeur=this.fluxIn.readLine();
     
    				//si rien n'est lut car le flux est fermé
    				if(messageServeur==null)
    				{
    					return;
    				}
    				//si le serveur envoie un message
    				else if(messageServeur.length()>0)
    				{	
    					//on met à jour le forum de l'IHM
    					this.fireForumChanged(messageServeur);
    				}
    			}
    		}
     
    		catch (IOException e)
    		{
    			e.printStackTrace();
    			this.fireMessageErreur(e.getMessage());
    		}
    		finally
    		{	
    			this.fluxOut.close();
    			try
    			{
    				this.fluxIn.close();
    			}
    			catch (IOException e)
    			{			
    				e.printStackTrace();
    			}
    		}
    	}
    	public void interrupt()
    	{
    		super.interrupt();
    		try
    		{
    			System.out.println("avant");
    			this.fluxIn.close();
    			System.out.println("apres");
    		}
    		catch (IOException e)
    		{
    			e.printStackTrace();
    		}
    	}
     
    	public void Deconnecter()
    	{
    		this.interrupt();
    	}
    Merci d'avance de vos réponses

  2. #2
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Citation Envoyé par Anonymouse Voir le message
    Bonjour

    Je cherche à tuer un thread java malgré le f
    Dommage, ça avait l'air intéressant !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Par défaut
    Citation Envoyé par DevTeam_ Voir le message
    Dommage, ça avait l'air intéressant !
    Touche tab + Entrer

  4. #4
    Membre chevronné Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Par défaut
    Que se passe-t-il si tu mets super.interrupt() à la fin de ta méthode surchargée ?

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Citation Envoyé par Anonymouse Voir le message
    Je cherche à tuer un thread java malgré le fait que celui-ci soit bloqué sur une opération d'E/S (Lecture dans un flux d'entrée). J'ai trouvé beaucoup de réponses sur le sujet mais aucune qui me convienne.
    Ben dit-donc. Et qu'ont ces méthodes qui ne te convienne pas ??

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Par défaut
    Citation Envoyé par T`lash Voir le message
    Que se passe-t-il si tu mets super.interrupt() à la fin de ta méthode surchargée ?
    Ca reste bloqué tout pareil

    Citation Envoyé par gifffftane Voir le message
    Ben dit-donc. Et qu'ont ces méthodes qui ne te convienne pas ??
    Bah la plupart proposent l'interruption par un flag donc ça ne peut marcher.
    J'ai vu aussi des liens qui proposent d'appliquer la méthode close() sur le socket pour générer une I/O Exception mais bon de un je trouve ça pas très classe de deux je ne peux pas différencier une "véritable IOexception" (Cad non attendue) d'une Exception déclenchée par l'appel à la méthode close.

  7. #7
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Mais si le thread est bloqué sur une opération d'entrée / sortie, il est normal de sortir en erreur, non ?... et donc de passer par un close et une IOException ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Par défaut
    Citation Envoyé par gifffftane Voir le message
    Mais si le thread est bloqué sur une opération d'entrée / sortie, il est normal de sortir en erreur, non ?... et donc de passer par un close et une IOException ?
    Ben si c'est l'utilisateur de l'application qui demande au thread de se fermer il va se prendre le même message d'erreur que si le thread se ferme inopinément.

  9. #9
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je comprends bien, mais il me semblait que l'hypothèse de base était un thread bloqué par accident.

    S'il apparaît que l'utilisateur, de façon normale, peut arrêter la conversation, et si tu t'intéresses à faire les choses dans les règles de l'art - même si le coup du close() est très usité - alors il faut changer ton fusil d'épaule et travailler avec les channels et nio.

    Tu trouveras plein de choses intéressantes sur le sujet à How to Stop a Thread or a Task, pour toi bien entendu au niveau du chapitre Blocking I/O, mais pas seulement.

Discussions similaires

  1. Analyse bloquée en "Lecture seule"
    Par fbe66 dans le forum WinDev
    Réponses: 2
    Dernier message: 08/08/2006, 15h16
  2. [API Win32 sans MFC] Lecture port série: thread bloqué
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/05/2006, 13h34
  3. [D6] Comment tuer un Thread ?
    Par Lung dans le forum Langage
    Réponses: 6
    Dernier message: 28/04/2006, 11h42
  4. [Debutant] Faut-il tuer les Threads Static?
    Par sniperseb dans le forum MFC
    Réponses: 5
    Dernier message: 05/12/2005, 14h43
  5. [Threads et interface] le thread bloque tout
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 28/10/2004, 16h52

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