2010-09-17 143 views
0

正計劃創建一個帶登錄的服務器線程(接受新客戶端並創建可處理它們的線程)和註銷方法。登錄方法將被socket.accept()方法阻塞以等待客戶端。如果服務器線程被其他方法阻塞,其他想要註銷的客戶端是否可以調用服務器線程上的註銷方法?可以阻塞的java線程的方法由另一個線程執行?

+0

如何提供一些代碼。 – Bozho 2010-09-17 13:13:21

+0

請澄清您的問題。一個線程沒有方法。類Thread和運行線程的實例是兩個完全不同的東西。 – Bombe 2010-09-17 13:22:58

回答

1

號如果一個線程被阻塞,爲它做任何額外的處理的唯一方法是通過喚醒並繼續執行。

這就是說,其他客戶線程可以調用操縱從自己的線程的共享數據結構的註銷方法。您可能希望查看併發方法,或者在服務器線程上使用NIO和非阻塞IO。

1

線程是執行的流程。你在這裏有多個。連接接受線程在accept()中被阻止。如果我理解正確,「客戶端」線程已經啓動並正在處理與連接客戶端的會話。我被「呼叫服務器線程上登出方法」猜你真的是「呼籲的logout()方法,也有login()方法」。由於「客戶端」線程會這樣做,所以應該沒問題,除非login()logout()未在同一個鎖定位置爭奪。

0

我認爲你應該使用接受,將只需要創建一個ThreadHandler並添加這方面給它一個線程,該ThreadHandle是另一個線程將登錄用戶,然後做你想做的更多。

我有這樣的代碼,聊天服務器:

while(true) 
{ 
Socket clientSocket = server.accept(); 
ClientThreadHandler c = new ClientThreadHandler(clientSocket); 
server.addClientThread(c); 
} 

處理程序現在將嘗試驗證客戶端。

也將是很好的落實心跳其中服務器會發送一個數據包的連接和認證的客戶端,檢查如果客戶端仍然向上。如果沒有,服務器將關閉連接。 ThreadHandler將始終傾聽客戶請求並處理它們。 不要忘記同步從不同線程訪問的方法。