Maison >Java >javaDidacticiel >Comment terminer en douceur une boucle `ServerSocket.accept()` bloquante dans un serveur multithread ?

Comment terminer en douceur une boucle `ServerSocket.accept()` bloquante dans un serveur multithread ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-25 17:44:43663parcourir

How to Gracefully Terminate a Blocking `ServerSocket.accept()` Loop in a Multithreaded Server?

Comment sortir gracieusement de la boucle bloquante ServerSocket accept()

Dans une application serveur multithread, le thread principal a généralement une boucle qui appelle accept() sur un ServerSocket pour gérer les connexions client entrantes. Cependant, si une commande d'arrêt est reçue, telle que « exit », il devient difficile d'interrompre la méthode bloquante accept() et de quitter le programme correctement.

Pour résoudre ce problème, envisagez l'approche suivante :

Utilisez la méthode close() d'un autre fil de discussion :

  1. Dans un fil de discussion séparé (par exemple, le fil de discussion Admin), créez un Socket et connectez-le au fil d'écoute. ServerSocket sur un port connu. Cela créera une fausse connexion entrante à partir du thread Admin lui-même.
  2. Lorsque le thread Admin reçoit la commande 'exit', il appelle close() sur son Socket connecté.
  3. Dans le thread principal , l'appel accept() lancera une SocketException une fois le ServerSocket fermé, permettant au thread principal de sortir de la boucle et de poursuivre le processus d'arrêt.

Exemple de code :

Thème principal :

<code class="java">while (listening) {
    try {
        Socket clientSocket = serverSocket.accept();
        // Start client thread and add it to collection
    } catch (SocketException e) {
        // Shutdown has been initiated, break out of loop
        listening = false;
    }
}</code>

Thème d'administration :

<code class="java">// Create and connect to listening server socket
Socket adminSocket = new Socket("localhost", port);

// Wait for 'exit' command
...

// Close the admin socket to interrupt the main thread
adminSocket.close();</code>

En suivant cette approche, l'acceptation () peut être interrompue par une SocketException levée lorsque le ServerSocket est fermé à partir d'un autre thread, permettant au programme de se terminer normalement en réponse aux commandes d'arrêt.

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