Dans le contexte de Java, je crée un nouveau thread pour lire l'entrée réseau lorsque j'ouvre une fenêtre graphique, et quand je ferme la fenêtre, je veux libérer la ressource socket et terminer le thread immédiatement. Maintenant j'utilise la méthode setSoTimeout, mais je ne veux pas attendre l'exception de timeout. Quelqu'un pourrait-il donner une suggestion? Merci!Comment mettre fin instantanément à un blocage de thread sur un socket IO?
Répondre
Il y a (potentiellement) trois façons de le faire:
Appel
Socket.close()
sur la prise fermera les objetsInputStream
etOutputStream
associés, et provoquer des threads bloqués dans les opérations de flux Socket ou (associé) à être débloqué. Selon le javadoc, les opérations sur le socket lui-même vont lancer unSocketException
.L'appel
Thread.interrupt()
(dans certaines circonstances non spécifiées) interrompt une opération d'E/S de blocage, provoquant l'envoi d'unInterruptedIOException
.Notez la mise en garde. Apparemment, l'approche "interruption()" ne fonctionne pas sur "la plupart" des plates-formes Java modernes. (Si quelqu'un d'autre avait le temps et l'envie, ils pourraient enquêter sur les circonstances dans lesquelles cette approche fonctionne.Mais le simple fait que le comportement est spécifique à la plate-forme devrait suffire à dire que vous ne devriez l'utiliser que si vous avez seulement besoin de votre application de travailler sur une plate-forme spécifique. a quel point vous pouvez facilement « essayer » pour vous-même.)
une troisième façon possible de le faire est d'appeler
Socket.shutdownInput()
et/ouSocket.shutdownOutput()
. Les javadocs ne disent pas explicitement ce qui se passe avec les opérations de lecture et/ou d'écriture qui sont actuellement bloquées, mais il n'est pas déraisonnable de penser qu'ils vont se débloquer et lancer une exception. Cependant, si le javadoc ne dit pas ce qui se passe alors le comportement devrait être supposé être spécifique à la plate-forme.
Dans quelles circonstances thread.interrupt() interrompt-il une opération d'E/S de blocage? –
Xu DXn - ce n'est pas documenté. Certains flux implémentent cela, d'autres non. Pour les détails sanglants, lisez le code source OpenJDK. Ce que j'essaie de dire, c'est que cela peut fonctionner ou non. –
assez sûr que la plupart des implémentations jvm ne supportent pas les opérations io interruptibles. Je pense que peut-être le sun solaris jvm l'a soutenu à un moment donné. – jtahlborn
Je sais que cette question est vieux, mais comme personne ne semble avoir résolu le « mystère » de Thread.interrupt()
sur les « plates-formes modernes » J'ai fait quelques recherches.
Ceci a été testé sur Java 8 sous Windows7 (64 bits) (mais cela pourrait aussi être vrai pour d'autres plateformes).
Appel Thread.interrupt()
ne pas jeter un InterruptedIOException
Ce qui se passe est que la méthode InputStream.read()
revient avec -1
et Thread.interrupted()
-flag est réglé.
Ainsi, les éléments suivants peuvent être considérés comme une lecture() 'corrigé' jetant InterruptedIOException
:
static final int read(Socket socket, byte[] inData)
throws SocketTimeoutException, // if setSoTimeout() was set and read timed out
InterruptedIOException, // if thread interrupted
IOException // other erors
{
InputStream in = socket.getInputStream();
int readBytes = in.read(inData, 0, inData.length);
if (Thread.interrupted())
{
throw new InterruptedIOException("Thread interrupted during socket read");
}
return readBytes;
}
Cette réponse mérite plus de votes parce que le comportement de Java lorsqu'il est interrompu pendant les opérations de flux Entrée/Sortie n'est pas ce que beaucoup de gens attendent. –
- 1. Non-blocage Socket Polling vs Blocage socket
- 2. Quitter un blocage de thread sur TCP read in C#
- 3. python quitte un thread de blocage?
- 4. Blocage dans un programme java à un seul thread
- 5. Comment mettre fin à un correctement thread de travail en C#
- 6. Obtenir un processus de mettre fin à
- 7. comment mettre fin à un fil lorsqu'il est en veille?
- 8. remplacer un swf instantanément
- 9. Un thread d'écriture, un thread de lecture sur le même socket?
- 10. Mettre fin à un workflow sans propriétaire
- 11. Boucle d'événements vs blocage Multithread IO
- 12. Comment tuer un fil instantanément en C#?
- 13. comment mettre à l'échelle ce client java simple thread?
- 14. comment mettre en œuvre un script de blocage IP
- 15. Perl IO :: problème de synchronisation de socket
- 16. Comment puis-je exécuter certaines commandes sur un thread séparé?
- 17. Comment mettre fin à un appel téléphonique en C# CF?
- 18. Comment mettre fin à un processus en cours dans matlab?
- 19. Erreur EAGAIN pour accepter sur le socket de blocage
- 20. Connexion à un TcpListener sur un thread différent, même processus
- 21. Comment détecter un blocage avec la bibliothèque Asio?
- 22. Entrée utilisateur en Perl avec IO :: Socket
- 23. Comment fermer un socket bloqué
- 24. Maintien de nombreuses connexions socket avec un seul thread
- 25. Meilleur moyen de mettre fin à un assistant dans android
- 26. Async Socket Listener sur thread séparé - VB.net
- 27. Comment enregistrer des sockets dans un hachage et faire une boucle sur un autre thread?
- 28. Traitement du délai d'expiration lors du blocage du socket .NET
- 29. Puis-je appeler select sur un socket de datagramme sans utiliser d'E/S de blocage
- 30. Tuer un thread qui attend la sortie du socket
Je ne comprends pas pourquoi cela a -1?!? Je pense que la question était très claire et sur place. –