ホームページ  >  記事  >  Java  >  マルチスレッドサーバーでブロッキング `ServerSocket.accept()` ループを正常に終了するにはどうすればよいですか?

マルチスレッドサーバーでブロッキング `ServerSocket.accept()` ループを正常に終了するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-25 17:44:43549ブラウズ

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

ブロッキング ServerSocket accept() ループから正常に抜け出す方法

マルチスレッド サーバー アプリケーションでは、通常、メイン スレッドには accept() を呼び出すループがあります。受信クライアント接続を処理するための ServerSocket。ただし、「exit」などのシャットダウン コマンドを受信した場合、ブロックしている accept() メソッドを中断してプログラムを正常に終了することが困難になります。

この問題に対処するには、次のアプローチを検討してください。

別のスレッドから close() メソッドを使用します:

  1. 別のスレッド (例: 管理スレッド) で、ソケットを作成し、リスニングに接続します。既知のポート上の ServerSocket。これにより、管理スレッド自体からの偽の受信接続が作成されます。
  2. 管理スレッドは「exit」コマンドを受信すると、接続されているソケットで close() を呼び出します。
  3. メイン スレッド内、ServerSocket が閉じられると、accept() 呼び出しは SocketException をスローし、メインスレッドがループから抜け出してシャットダウン プロセスを続行できるようにします。

コード例:

メイン スレッド:

<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>

管理スレッド:

<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>

このアプローチに従うと、 () メソッドは、ServerSocket が別のスレッドから閉じられたときにスローされる SocketException によって中断されるため、シャットダウン コマンドに応答してプログラムを正常に終了できます。

以上がマルチスレッドサーバーでブロッキング `ServerSocket.accept()` ループを正常に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。