ServerSocket の accept() メソッドの中断
マルチスレッド アプリケーションでは、多くの場合、accept() などの長時間実行されるブロック操作を中断して、重大なイベントに対応します。 ServerSocket の場合、accept() が新しいクライアント接続を待機するため、シャットダウン要求を適切に処理するには中断が不可欠になります。
accept() を中断する効率的な方法の 1 つは、別のスレッドから基礎となるソケットを閉じることです。 close() が呼び出されると、同じソケット上のアクティブまたは保留中の accept() 呼び出しは中断されます。これは、close() 操作が SocketChannel のクローズ済みフラグを設定し、ソケット操作に使用できなくなったことを通知するためです。
このアプローチを示すコード例を次に示します。
<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>
この中でたとえば、メインスレッドは、accept() を使用してクライアント接続を待機するループに入ります。その間、管理スレッドは同時に実行され、コマンドを待機します。 「exit」コマンドが管理スレッドで受信されると、サーバーソケットが閉じられます。このアクションにより、メインスレッドの accept() 呼び出しが中断され、待機ループから抜け出してシャットダウン プロセスを続行できるようになります。
accept() を中断するには close() メソッドを使用することに注意することが重要です。 ) 潜在的な競合状態を避けるために慎重に行う必要があります。クライアント接続の進行中に accept() 呼び出しが中断されると、接続の切断や予期しない動作が発生する可能性があります。ベスト プラクティスとして、accept() 呼び出しの周囲に同期ブロックを使用して、サーバー ソケットへの排他的アクセスを確保することをお勧めします。
以上がマルチスレッド環境で ServerSocket の `accept()` メソッドを中断して、シャットダウン要求を適切に処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。