首頁  >  文章  >  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?

如何優雅地跳出阻塞的ServerSocketaccept() 循環

在多執行緒伺服器應用程式中,主執行緒通常有一個循環,該循環呼叫accept()用於處理傳入客戶端連線的ServerSocket。但是,如果收到關閉命令,例如“退出”,則中斷阻塞的accept()方法並正常退出程序就變得具有挑戰性。

要解決此問題,請考慮以下方法:

使用另一個執行緒的close() 方法:

  1. 在一個單獨的執行緒(例如管理執行緒)中,建立一個Socket 並將其連接到監聽已知連接埠上的ServerSocket。這將從管理線程本身創建一個虛假的傳入連接。
  2. 當管理執行緒收到「退出」指令時,它會在其連接的套接字上呼叫 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn