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

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

DDD
DDDoriginal
2024-10-27 09:45:03759parcourir

Here are a few question-based titles that capture the essence of the article:

* How to Interrupt a Blocking ServerSocket `accept()` Method in Java?
* Gracefully Shutting Down a Java Server: Interrupting the `accept()` Method
* What Happens When You Call

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn