服務器本質上是一個項目隊列,而客戶端充當這些項目的生產者和/或消費者。Java中的多線程服務器
服務器必須:
- 傾聽放/取請求,並相應地處理它們 - 這通常不會花太長時間,它包括:
- 解析短串;
- 安
HashMap.get
; - 獲取鎖定;
- A
PriorityQueue.poll
或PriorityQueue.offer
;
- 通知所有項目活動的每一個客戶端,只要有可能,讓每一個客戶有一個實時鑑於這是怎麼回事的。
設置此功能的最簡單的方法,是由具有螺紋accept
荷蘭國際集團的客戶,然後爲每個客戶端創建兩個線程:
- 一個處理該
InputStream
,哪些塊等待請求; - 而另一個處理
OutputStream
,它監聽隊列上的事件,並將信息發送到客戶端。
當然,這是不可擴展的,並且爲每個客戶端擁有兩個線程似乎是浪費。
我也想過使用一個線程,這將
- 設置套接字超時約1
read
秒; - 繼續發送每個新事件給客戶端,如果
read
超時或處理請求後; - 循環這兩個動作。
但是,輪詢請求和事件也是浪費。
另一種方法是使用線程池,並將上述兩個操作中的每一個放在它們各自的Runnable
中。然後這些可運行的對象將在Executor
中彼此排隊。 這似乎也是浪費,如果不是更多。
我一直在讀somequestions,我現在好奇NIO,因爲非阻塞操作和事件驅動服務器似乎是正確的方法。
以上任何一種設計是否適合這項任務,還是應該使用NIO來解決?
就數字而言,這更是一個鍛鍊比真正的系統,所以它與數千客戶不必交易,但是,理想情況下,它應該能夠執行和規模好。
這是有道理的。每個客戶端想要線程的主要原因之一是,如果連接速度很慢,那麼只有該線程/客戶端會因此而受到影響。有一組更新線程將事件廣播到所有客戶端會遭受連接速度緩慢的影響,但我想這是無法解決的。 – afsantos