comment puis-je arrêter la méthode des blocs DatagramSocket.recevoir() dans un thread
- je créer un DatagramSocket
dans le thread principal,puis créer un intérieur de classe thread pour écouter le port. quand je ferme les DatagramSocket
dans le thread principal, il venait toujours sur une erreur socket closed
parce que dans l'intérieur de la classe thread, j'ai appelé le receive()
méthode,et il s'est bloqué à l'intérieur de la classe thread. voici le code de l'intérieur de la classe:
class ReceiveText extends Thread
{
@Override
public void run()
{
while(true)
{
byte[] buffer = new byte[1024];
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
try {
udpSocket.receive(dp);//blocked here
byte[] data = dp.getData();
String message = new String(data, 0 , dp.getLength());
setTxtAreaShowMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
je veux arrêter de l'intérieur de la classe thread avant de fermer la DatagramSocket, mais le stop()
méthode n'est pas recommandée. comment puis-je le faire?
OriginalL'auteur cloud | 2011-11-01
Vous devez vous connecter pour publier un commentaire.
Fermer le socket, qui ne cessera de le recevoir() appel de blocage. Si vous définissez d'abord fermé drapeau puis dans le catch (IOException) bloc que vous pouvez en toute sécurité ignorer l'exception si le drapeau est réglé. (Vous pourriez aussi utiliser isClosed() la méthode sur DatagramSocket au lieu d'un drapeau)
Je peux aussi confirmer que cela fonctionne! Belle façon de sortir d'un thread de travail qui est dans une boucle de réception sur un socket datagramme.
OriginalL'auteur prunge
Socket.close() fait le tour. Ou vous pouvez utiliser socket.setSoTimeout(1000); la setSoTimeout() la méthode permet de définir un délai d'attente en millisecondes. Par exemple:
Ici est la javadoc pour setSoTimeout();
Par défaut, le délai d'attente est 0, ce qui est à durée indéterminée, en modifiant à un nombre positif, elle ne bloquera que pour le montant que vous avez spécifié. (Assurez-vous de le définir avant d'appeler le support.recevoir())
Voici un exemple de réponse sur ce site:
set timeout pour socket receive
OriginalL'auteur Cheng
Avec UDP, vous pouvez envoyer l'un socket datagramme à partir d'un autre thread, afin de débloquer la lecture(). Le datagran pourrait, (selon le protocole), contient un "suicide" de commande ou vous pouvez utiliser un 'shutdown' booléen qui le thread lit après l'avoir lu() retourne.
OriginalL'auteur Martin James