Interrompre la méthode accept() d'un ServerSocket
Dans les applications multithread, il est souvent nécessaire d'interrompre les opérations de blocage de longue durée comme accept() pour répondre aux événements critiques. Dans le cas de ServerSocket, où accept() attend de nouvelles connexions client, l'interrompre devient essentiel pour gérer correctement les demandes d'arrêt.
Un moyen efficace d'interrompre accept() consiste à fermer le socket sous-jacent à partir d'un autre thread. Lorsque close() est appelé, tous les appels accept() actifs ou en attente sur le même socket seront interrompus. En effet, l'opération close() définit l'indicateur fermé du SocketChannel, signalant qu'il n'est plus disponible pour les opérations de socket.
Voici un exemple de code qui illustre cette approche :
<code class="java">public class Main { public static void main(String[] args) { // Initialize ServerSocket and Admin thread ServerSocket serverSocket = new ServerSocket(); Thread adminThread = new Thread(() -> { // Process commands from the Admin thread while (true) { String command = readCommandFromConsole(); if ("exit".equals(command)) { // Interrupt the main thread by closing the ServerSocket serverSocket.close(); } } }); adminThread.start(); // Main server loop while (true) { try { // Accept client connections Socket clientSocket = serverSocket.accept(); } catch (SocketException e) { // Socket was closed, indicating an interruption from the Admin thread break; } } // Shutdown gracefully adminThread.join(); System.out.println("Server exited gracefully"); } }</code>
Dans ce Par exemple, le thread principal entre dans une boucle qui attend les connexions client à l'aide de accept(). Pendant ce temps, le thread Admin s’exécute simultanément, en attente de commandes. Lorsque la commande "exit" est reçue dans le thread Admin, le socket du serveur est fermé. Cette action interrompt l'appel accept() dans le thread principal, lui permettant de sortir de la boucle d'attente et de poursuivre le processus d'arrêt.
Il est important de noter que l'utilisation de la méthode close() pour interrompre accept( ) doit être effectué avec soin pour éviter d'éventuelles conditions de concurrence. Si l'appel accept() est interrompu alors qu'une connexion client est en cours, cela peut entraîner une perte de connexion ou un comportement inattendu. À titre de bonne pratique, il est conseillé d'utiliser un bloc synchronisé autour de l'appel accept() pour garantir un accès exclusif au socket du 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!