簡體   English   中英

多線程服務器如何工作?

[英]how does a multi-threaded server work?

我從某人那里得到了這個示例,並在android上使用了多線程服務器:

http://tutorials.jenkov.com/java-multithreaded-servers/singlethreaded-server.html

但是我在理解部分代碼方面有一些困難:

while(! isStopped()) {
    Socket clientSocket = null;
    try {
        clientSocket = this.serverSocket.accept();
    } catch (IOException e) {
        if (isStopped()) {
            System.out.println("Server Stopped.") ;
            return;
        }
        throw new RuntimeException("Error accepting client connection", e);
    }

我不明白的是,當我在此行出現異常時會發生什么:

clientSocket = this.serverSocket.accept();

據我所知,該函數被調用:

private synchronized boolean isStopped() {
    return this.isStopped;
}

但是如何關閉該套接字? 如果您在嘗試接受客戶端時遇到異常,則應關閉accept返回的套接字。

我認為這是在這里完成的:

public synchronized void stop() {
    this.isStopped = true;
    try {
        this.serverSocket.close();
    } catch (IOException e) {
        throw new RuntimeException("Error closing server", e);
    }
}

但是stop()在哪里被調用,它如何在isStopped()onStop()之間isStopped()連接。那么“同步”又是什么呢?

希望我已經清楚我的不確定性! 預先謝謝你:)

您可能已經搬家了,但為了后代...

當我在此行遇到異常時會發生什么

clientSocket = this.serverSocket.accept();

如果您在accept內收到異常,則不會返回任何套接字,因此沒有要關閉的內容。 accept()返回您應該處理然后關閉的有效套接字, 否則將引發異常。 永遠不要都。

在哪里調用stop()

Stop看起來是由某些想要關閉服務器套接字的調用者從外部調用的。 使用服務器,您可以創建服務器套接字,然后接受與遠程客戶端的單獨連接,這將為該客戶端返回一個套接字。 每個客戶端處理程序都需要關閉各自的連接。 當服務器關閉時(在這種情況下,當調用stop()時),然后關閉服務器套接字。

調用stop()之后,服務器套接字將關閉, accept()方法將引發異常。 這就是為什么在代碼中進行if(isStopped())檢查以避免引發異常的原因。

如何在isStopped()onStop()之間isStopped()連接

isStopped()是一個私有方法,用於測試是否有人調用過stop()方法。 我假設onStop()是Android方法? 它們沒有關系,盡管有人可能想在onStop()內調用singleThreadedServer.stop() onStop()

synchronized什么?

多線程程序將synced關鍵字用作互斥量和內存屏障。 它一次只允許1個線程在synchronized塊內部執行。 它還確保所有本地變量在線程和中央內存之間同步。 請參閱Java文檔:

http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

同步該私有方法確實是總的IMO。 我認為這樣做是為了確保isStopped已更新。 我本來會使用volatile布爾值或AtomicBoolean

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM