Maison  >  Article  >  Java  >  Comment interrompre gracieusement une méthode bloquante ServerSocket.accept() ?

Comment interrompre gracieusement une méthode bloquante ServerSocket.accept() ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 18:58:30462parcourir

How to Gracefully Interrupt a Blocking ServerSocket.accept() Method?

Interruption d'une méthode bloquante ServerSocket Accept()

Dans une application multithread, il peut être nécessaire d'interrompre une méthode de blocage telle que ServerSocket.accepter(). Ceci est généralement requis pour un arrêt progressif ou pour répondre aux commandes administratives.

La méthode traditionnelle accept() se bloque jusqu'à ce qu'une connexion client soit reçue. Ce comportement peut entraver la capacité de répondre à des événements externes ou de terminer l'application rapidement.

Solution : utiliser Close() pour interrompre

Une solution efficace pour interrompre le blocage La méthode accept() consiste à appeler close() sur l’objet ServerSocket à partir d’un thread séparé. Lorsque close() est invoquée, la méthode accept() lèvera une SocketException.

<code class="java">// In the admin thread
ServerSocket serverSocket = ...;
serverSocket.close();</code>

Gestion de l'interruption

Dans la boucle principale où accept() se trouve étant appelé, il est nécessaire d'attraper la SocketException et de la gérer avec élégance.

<code class="java">while (listening) {
    try {
        // Accept client connection
        Socket clientSocket = serverSocket.accept();
        // ... Process client connection
    } catch (SocketException e) {
        // Handle the interruption
        // ... Shut down client threads, admin thread, and main thread
        break;
    }
}</code>

Avantages de cette approche

  • Permet un arrêt progressif de l'application , même pendant que accept() bloque.
  • Fournit un moyen fiable d'interrompre la méthode de blocage sans avoir à modifier la classe ServerSocket elle-même.

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