正計劃創建一個帶登錄的服務器線程(接受新客戶端並創建可處理它們的線程)和註銷方法。登錄方法將被socket.accept()方法阻塞以等待客戶端。如果服務器線程被其他方法阻塞,其他想要註銷的客戶端是否可以調用服務器線程上的註銷方法?可以阻塞的java線程的方法由另一個線程執行?
0
A
回答
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將始終傾聽客戶請求並處理它們。 不要忘記同步從不同線程訪問的方法。
相關問題
- 1. 阻塞線程 - Java
- 2. Java線程阻塞
- 3. Java線程阻塞
- 4. 線程只阻塞第一個線程
- 5. 阻塞隊列+線程+執行線程的序列
- 6. 將幾個Java方法轉換爲非阻塞線程運行?
- 7. Python阻塞的線程終止方法?
- 8. 阻塞線程的調用方法
- 9. 並行線程:取消阻塞線程
- 10. 線程執行器非阻塞列表
- 11. 從另一個線程處理線程執行的可能方法?
- 12. 將線程阻塞轉換爲f中的非線程阻塞#
- 13. Thread.sleep()方法阻塞主UI線程
- 14. MessageBeep線程阻塞
- 15. 爲什麼啓動一個線程被另一個線程阻塞?
- 16. 從另一個線程返回一個值。沒有阻塞主線程
- 17. python爲什麼在一個線程中真正阻塞另一個線程
- 18. 帶線程的Java Servlet阻塞?
- 19. 爲什麼NSTimer在另一個線程運行時被阻塞?
- 20. 如何啓動不阻塞Java主線程的後臺線程?
- 21. C#ThreadPool一個線程阻塞其他?
- 22. 一個Node.js線程阻塞另一個嗎?
- 23. 阻塞隊列不阻塞線程?
- 24. 當一個線程被阻塞時,可能導致在同一個進程或整個進程中阻塞另一個線程?
- 25. java多線程應用程序:正在線程阻塞時間
- 26. 在另一個線程中調用Thread.sleep()時UI線程被阻塞
- 27. Java代碼 - 線程彼此阻塞
- 28. Java喚醒阻塞線程定期
- 29. 非阻塞多線程MySQL與Java
- 30. Java輸入流「阻塞」和多線程
如何提供一些代碼。 – Bozho 2010-09-17 13:13:21
請澄清您的問題。一個線程沒有方法。類Thread和運行線程的實例是兩個完全不同的東西。 – Bombe 2010-09-17 13:22:58