comment puis-je arrêter la méthode du bloc DatagramSocket.receive () dans un thread

Je crée un DatagramSocket dans le thread principal, puis un thread de classe interne pour écouter le port. Lorsque je ferme le DatagramSocket dans le thread principal, il rencontrait toujours un socket closed erreur car, dans le thread de classe interne, j’appelais la méthode receive() et bloquait le thread de classe interne. voici le code de la classe interne:

 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(); Ssortingng message = new Ssortingng(data, 0 , dp.getLength()); setTxtAreaShowMessage(message); } catch (IOException e) { e.printStackTrace(); } } } } 

Je veux arrêter le thread de classe interne avant de fermer le DatagramSocket, mais la méthode stop() n’est pas recommandée. Comment puis je faire ça?

Fermez le socket, ce qui empêchera l’appel de receive () de se bloquer. Si vous définissez d’abord un indicateur fermé, vous pouvez ignorer l’exception en toute sécurité dans le bloc catch (IOException) si cet indicateur est défini. (Vous pouvez probablement aussi utiliser la méthode isClosed () sur DatagramSocket au lieu d’un indicateur)

Socket.close () fait le tour. Ou vous pouvez utiliser socket.setSoTimeout (1000); La méthode setSoTimeout () vous permet de définir un délai d’expiration en millisecondes. Par exemple:

 //if the socket does not receive anything in 1 second, //it will timeout and throw a SocketTimeoutException //you can catch the exception if you need to log, or you can ignore it socket.setSoTimeout(1000); socket.receive(); 

Voici le javadoc pour setSoTimeout () ;

Par défaut, le délai d’attente est 0, ce qui est indéterminé. En le changeant en nombre positif, il ne bloquera que le montant que vous avez spécifié. (Assurez-vous de le définir avant d’appeler socket.receive ())

Voici un exemple de réponse sur ce site: set timeout pour socket receive

Avec UDP, vous pourriez envoyer au socket un datagramme depuis un autre thread, donc débloquant read (). La datagran peut (en fonction de votre protocole) contenir une commande “suicide” ou vous pouvez utiliser un booléen “shutdown” supplémentaire que le thread lit après le retour de read ().