Maison > Java > javaDidacticiel > le corps du texte

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

Susan Sarandon
Libérer: 2024-10-25 17:44:43
original
548 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!