Comment arrêter un thread en attente dans un blocage de l'opération de lecture en Java?
J'ai un thread qui exécute le code suivant:
public void run() {
try {
int n = 0;
byte[] buffer = new byte[4096];
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
out.flush();
}
} catch (IOException e) {
System.out.println(e);
}
}
où in
est System.in
. Comment puis-je arrêter un tel thread gracieusement? Ni la fermeture de System.in
, ni l'utilisation de Thread.interrupt
semble fonctionner.
- ce qui se passe lorsque vous utilisez l'interrompre?
- Fil continue de fonctionner jusqu'à ce que Ctrl-D (EOF) est entré manuellement.
Vous devez vous connecter pour publier un commentaire.
C'est à cause du Système de lecture.dans (InputStream) est une opération de blocage.
Regardez ici Est-il possible de lire à partir d'un InputStream avec un délai d'attente?
FileChannel
extrait deSystem.in
permet d'arrêter le fil en fermant simplementSystem.in
. FermetureSystem.in
résultats dansAsynchronousCloseException
qui interrompt le blocageFileChannel.read
.Vous avez trébuché sur un de 9 ans bug personne n'est prêt à les réparer. Ils disent qu'il ya quelques solutions de contournement dans ce rapport de bug. Très probablement, vous aurez besoin de trouver une autre façon de définir le timeout (occupé attente semble inévitable).
Vous pouvez utiliser la disponible (), méthode (qui est non-bloquant) pour vérifier si il n'y a rien à lire à l'avance.
En pseudo-java:
available
presque fait le tour. Le problème est que dans le cas des expressions du FOLKLOREavailable
retourne 0 et le fil continue l'exécution. +1 pour compenser injuste -1 =)J'ai eu le même problème aujourd'hui, et ce est la façon dont je l'ai fixée, à l'aide de
in.ready()
:Est-il sécuritaire de proximité dans les flux dans l'autre thread?
Il fonctionne pour moi. Dans ce cas,
in.read(...)
throws exceptionSocketException
.Si vous voulez donner à l'utilisateur un certain temps pour entrer des données, peut - être à permet d'écraser les valeurs par défaut ou d'interrompre certains processus automatisé -, puis attendre d'abord et vérifier les entrées après la pause:
vous pouvez utiliser un externe drapeau pour cette