OVH Cloud OVH Cloud

BufferedReader.readLine() : thread bloqué

3 réponses
Avatar
Kupee
Salut, j'ai un problème avec un thread bloqué sur un readLine() dans un
BufferedReader.
Aucune donnée n'arrive j'ai fais un readline, le thread est donc bloqué.
Maintenant j'aimerai que ce thread s'arrête. quelle est la solution pour
ca ? je ne peux pas fermer le reader car il est locké par l'appel a
readLine() ...

3 réponses

Avatar
Hervé AGNOUX
Kupee wrote:

Salut, j'ai un problème avec un thread bloqué sur un readLine() dans un
BufferedReader.
Aucune donnée n'arrive j'ai fais un readline, le thread est donc bloqué.
Maintenant j'aimerai que ce thread s'arrête. quelle est la solution pour
ca ? je ne peux pas fermer le reader car il est locké par l'appel a
readLine() ...


Il faut avoir créé auparavant un autre thread, duquel tu fais le close de
ton BufferedReader au moment qui te parait opportun. Le thread en lecture
sortira alors de son attente par une IOException.


--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
Kupee
Hervé AGNOUX wrote:
Salut, j'ai un problème avec un thread bloqué sur un readLine() dans un
BufferedReader.
Aucune donnée n'arrive j'ai fais un readline, le thread est donc bloqué.
Maintenant j'aimerai que ce thread s'arrête. quelle est la solution pour
ca ? je ne peux pas fermer le reader car il est locké par l'appel a
readLine() ...



Il faut avoir créé auparavant un autre thread, duquel tu fais le close de
ton BufferedReader au moment qui te parait opportun. Le thread en lecture
sortira alors de son attente par une IOException.


Cela pourrait marcher encore que j'ai un petit doute : le readLine est
synchronisé sur le lock du reader, mais lorsqu'il rempli son buffer peut
etre qu'il fait un wait s'il n'y a rien a lire ...
J'ai en fait oublié un point qui me parrait important : mon
BufferedReader lis sur System.in, et j'ai bien l'impression qu'on peut
pas le stopper celui là. Du moins j'ai essayé et ca ne ressort jamais du
close() ...


Avatar
Sébastien
Cela pourrait marcher encore que j'ai un petit doute : le readLine est
synchronisé sur le lock du reader, mais lorsqu'il rempli son buffer peut
etre qu'il fait un wait s'il n'y a rien a lire ...
J'ai en fait oublié un point qui me parrait important : mon
BufferedReader lis sur System.in, et j'ai bien l'impression qu'on peut
pas le stopper celui là. Du moins j'ai essayé et ca ne ressort jamais du
close() ...


c'est normal vu la synchronisation sur l'objet "lock".

Une idée comme ça : tu pourrais essayer d'encapsuler System.in par un InputStream maison qui, lui,
pourrait être fermé:
- sur le read, ton stream teste available() du System.in avant d'esayer de lire le moindre octet,
histoire de ne pas se faire bloquer. Quand il n'y a rien, il attend en faisant des wait(<petite
tempo>) et donc bloque le BufferedReader.
- sur un close de ton stream : tu fais un notify et tu retournes -1 dans la méthode read => ton
buffered reader s'arrête.

Sébastien