[英]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.