2016-11-28 27 views
0

我正在創建一個包含許多機器的分佈式系統以供學習。我需要在機器之間發送和接收數據,並且我正在使用java.nio創建該網絡。在一臺機器上,我使用一個線程爲serversocketchannel從其他機器接收數據,併爲每個數據包使用我創建的新線程發送它。這意味着一個線程用於接收和多個線程在一臺機器上發送。我應該使用多少個線程來使用java.nio發送和接收數據?

但我面臨一個問題,即一個線程處理接收,許多客戶端將在連接時掛起。 我應該將其更改爲一個線程處理接收和一個線程處理髮送? 謝謝 P/s:我不想使用任何第三方框架。

回答

0

如果網絡中的發送者比接收者多,那麼顯然有些發送者最終會等待。如果你的接收者多於發送者,那麼顯然有些接收者會空閒,因爲幾乎所有的時間發送者都可能會一對一地連接到​​接收者。


我不能判斷你應該做什麼,因爲我不知道你在做什麼。

無論如何,在接收端使用的兩種常見的模式是:

  • 一個線程處理所有
  • 一個線程處理只是接受連接,並打開流,然後委託與該流的實際工作到另一個線程(通常來自線程池以防止在爲每個連接創建新線程時可能發生的資源耗盡)
+0

這是我的情況。我有4臺機器。在某些點上,機器#1需要從其他三個接收10000個字節。你的意思是,在機器#1中我可以使用2個線程,第1個線程可以接受連接並打開流,然後轉移到另一個線程接收字節,然後第1個線程返回以再次聆聽新來的連接?你是這個意思嗎? – hminle

+0

是的,這是常用的方法。通常,您不知道會有多少發件人(例如,使用Web服務器)。您仍然需要在服務器上有多少個「工作人員」線程,因爲網絡中有發送者線程(另外還有一個線程只接受連接並將工作委託給工作人員),以便所有發件人同時得到服務。 –

+0

但是,我正在使用java nio,你怎麼能在java nio中分開兩部分?這是我如何實現我的服務器線程 https://gist.github.com/hminle/0e4a18ad5b3b37ee57348e673c5262fd – hminle

相關問題