Maison >Java >javaDidacticiel >Voici quelques titres basés sur des questions qui capturent l'essence de l'article : * Comment interrompre une méthode `accept()` bloquante de ServerSocket en Java ? * Arrêt progressif d'un serveur Java : interruption
Interruption de la méthode ServerSocket Accept()
En Java, la classe ServerSocket fournit la méthode accept() pour attendre les demandes de connexion client entrantes. Cette méthode se bloque jusqu'à ce qu'un client se connecte, potentiellement indéfiniment. Lors de la conception d'une application serveur multithread, il est parfois nécessaire d'interrompre cette opération de blocage en réponse à des événements externes.
Considérez le scénario décrit dans la question, où un thread « Admin » doit arrêter le serveur (y compris threads clients) et le thread principal. L'appel bloquant accept() dans le thread principal empêche le serveur de répondre aux demandes d'arrêt du thread Admin.
Pour résoudre ce problème, la communauté Java recommande d'utiliser la méthode close() pour interrompre l'appel accept() . Voici comment procéder :
À partir d'un thread séparé (dans ce cas, le thread Admin), appelez la méthode close() sur l'objet ServerSocket. Cela entraînera l'appel accept() dans le thread principal à lancer une SocketException.
Dans le thread principal, dans la boucle while(listening), gérez l'exception SocketException lancée par accept() pour arrêter le serveur en douceur. et terminez le processus d'arrêt.
Voici un extrait de code pour illustrer cette approche :
<code class="java">ServerSocket serverSocket = new ServerSocket(port); while (listening) { try { Socket clientSocket = serverSocket.accept(); // Handle client connection } catch (SocketException e) { // Shutdown the server and other threads listening = false; // Notify client threads to disconnect } }</code>
En utilisant la méthode close() pour interrompre l'appel bloquant accept(), vous pouvez répondre aux événements externes et arrêtez gracieusement le serveur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!