2010-01-21 55 views
1

我正在用Java編寫一個Stomp協議客戶端,它只有一個線程來處理IO。這意味着線程將來回讀取和寫入數據到應用程序。我的問題是,如果我需要通過多線程和NIO來擴展此應用程序,那麼可以如何安排?如何擴展這個單線程java客戶端?

我的IO處理器線程被稱爲「TcpLink」鏈接,它具有以下skeletion

class TcpLink implements Runnable { 

     public void run() { 
      // read data from socket and assign it to a byte buffer 
      // notify the listening application 
     } 
    } 

如果我需要讓多個線程分派收到的消息,如何類應該改變?

謝謝!

+0

這是客戶端還是服務器? – danben 2010-01-21 17:28:30

+0

這是客戶端。 – 2010-01-22 04:00:15

回答

2

我真的很喜歡this Doug Lee presentation關於設計基於Java NIO的可擴展系統。

實質上,您的設計通常基於Reactor pattern,其中單個I/O線程繞過許多客戶端連接。如果I/O線程飽和,可以考慮將主反應堆與一個或多個兒童反應堆連接起來;每個反應器都含有自己的螺紋。

另外重要的一點在設計中要注意的是,I/O線程只能執行I/O和通常應派遣任何入站郵件到一個單獨的線程(例如,ExecutorService)做任何實際工作。這可以防止在給定消息正在處理時其他連接不需要I/O。

+0

在此先感謝亞當斯分享這樣一個良好的演示文稿和你的知識... – 2010-01-22 03:47:17

1

編寫一個管理TcpLink類列表的包裝類將是一個更好的主意。包裝類的角色將接收傳入的消息並將其分配給等待/ feww TcpLink實例,您可以計算吞吐量/ TPS並在需要時創建新實例。現在你將只創建一個,這樣它就是一個單獨的。

+0

非常感謝您的答案Teja ... 我認爲你的意思是某種線程池,是不是?所以我可以使用ExecutorService或其他類型的工具來實現這一點。 – 2010-01-22 03:50:09