comment tuer un thread qui est en attente pour la fonction de blocage d'appel en Java?
J'ai un fil:
Thread t = new Thread(){
public void run(){
ServerSocketConnection scn = (ServerSocketConnection)
Connector.open("socket://:1234");
//Wait for a connection.
SocketConnection sc = (SocketConnection) scn.acceptAndOpen();
//do other operation
}
};
t.start();
Permet de dire que aucun client se connecte au Serveur, donc ce thread va être bloqué.Maintenant, je veux tuer le fil au-dessus de t? Comment puis-je le tuer?
OriginalL'auteur anupsth | 2010-08-06
Vous devez vous connecter pour publier un commentaire.
Thread.interrupt()
sera pas interrompre un thread bloqué sur un socket. Vous pouvez essayer d'appelerThread.stop()
ouThread.destroy()
, mais ces méthodes sont obsolètes (edit: en fait, absent en J2ME) et, dans certains cas, la non-fonctionnels, pour des raisons que vous pouvez lire sur ici. Comme l'article le mentionne, la meilleure solution dans votre cas est de fermer le socket que vous êtes blocage sur:J2SE... en tout cas, je me dis:
ok, parce qu'il parle de java-moi ici...
Je pense que le point principal est toujours d'actualité: vous avez à tuer ce que vous avez bloque sur, vous ne pouvez pas tuer le fil directement... je devine la raison stop() n'existe pas dans J2ME est parce que les raisons données dans l'article que j'ai lié.
OriginalL'auteur Tom Crockett
Vous pouvez appeler
thread.interrupt()
. Cela permettra de jeter unInterruptedException
dans votre filc'est une Exception d'exécution qui n'est pas généré par acceptAndOpen mais par le Fil de la classe.
Dans lequel l'API est InterruptedException une exception d'exécution? Vous avez une URL?
OriginalL'auteur Nikolaus Gradwohl
Appel Fil de discussion.interrupt(). Opérations de blocage généralement jeter un InterruptedException si le Fil ils sont en cours d'exécution est interrompue.
OriginalL'auteur Tim Bender
Faire le Thread principal THREAD de contrôle (à partir de l'endroit où vous frayer ce nouveau Thread) join() pour ce Thread. Si après un temps donné, ce thread ne pas "adhérer", alors vous pouvez ignorer (annuler) ce fil. Cela vous donnera une fonctionnalité ajoutée en ajoutant le temps pour le blocage de fil.
OriginalL'auteur Tushar Tarkas
Je pense que vous n'avez qu'à fermer la connexion, et donc tout simplement faire
scn
un champ de la discussion et de mettre en œuvre:et le code de votre méthode principale pour quitter gracieusement sur
IOException
ou une autre indication que vous êtes fait (comme vous l'avez probablement déjà).OriginalL'auteur Sam Brightman
Dans votre thread principal (lorsque vous souhaitez mettre fin à l'accepter-thread) appel
scn.close()
. LeacceptAndOpen
devrait alors jetez unIOException
, que vous pouvez attraper et ensuite mettre fin à l'accepter-fil gracieusement.Une bonne idée serait d'introduire une mécanisme de synchronisation afin de ne pas fermer le socket à droite après le acceptAndOpen s'est passé.
OriginalL'auteur aioobe
Je viens d'arrivé sur cette page à la recherche pour la même réponse. J'ai trouvé un moyen de fermer les Threads et c'est ce que je fais à la fin le serveur:
Fondamentalement, faire référence à votre serveur thread, null, puis laissez-le garbage collector de nettoyer les ressources (ce qui est ton serveur) pour vous.
Noter cependant: C'est loin d'être parfait, on ne devrait jamais dépendre gc pour faire son travail, mais il semble fonctionner à chaque fois que je l'ai essayé
OriginalL'auteur Molten Ice