1. 程式人生 > >Java NIO框架Netty教程(五)-Netty中OIO模型(對比NIO)

Java NIO框架Netty教程(五)-Netty中OIO模型(對比NIO)

一篇OIO和NIO對比的小研究。Netty中不光支援了Java中NIO模型,同時也提供了對OIO模型的支援。(New IO vs Old IO)。

首先,在Netty中,切換OIO和NIO兩種模式是非常方便的,只需要初始化不同的Channel工程即可。

ServerBootstrap bootstrap =new ServerBootstrap(
                newOioServerSocketChannelFactory(
                        Executors.newCachedThreadPool(),
                        Executors.newFixedThreadPool(4)));
ServerBootstrap bootstrap =new ServerBootstrap(
                newNioServerSocketChannelFactory(
                        Executors.newCachedThreadPool(),
                        Executors.newFixedThreadPool(4)));

這就是Netty框架為我們做的貢獻。

再說說,這兩種情況的區別。OneCoder根據網上的資料和自己的理解,總結了一下:在Netty中,是通過worker執行任務的。也就是我們在構造bootstrap時傳入的worker執行緒池。對於傳統OIO來說,一個worker對應的channel,從讀到操作到再到回寫,只要是這個channel的操作都通過這個worker來完成,對於NIO來說,到MessageRecieved之後,該worker的任務就完成了。所以,從這個角度來說,非常建議你在Recieve之後,立即啟動執行緒去執行耗時邏輯,以釋放worker。

基於這個分析,你可能也發現了,上面的程式碼中我們用的是FiexedThreadPool。固定大小為4,從理論上來說,OIO支援的client數應該是4。而NIO應該不受此影響。測試效果如下圖:

8個Client連線:

NIOServer的執行緒情況:

並且8個Client的請求都正常處理了。

對於OIO來說,如果你對worker池沒有控制,那麼支援8個client需要8個worker,8個執行緒,這也就是傳統OIO併發數受限的原因,如圖:

當OIO使用FixedThreadPool的時候:

只能處理頭四個client的請求,他的被堵塞了。

但是,在Netty框架中,不論是OIO和NIO模型,讀寫端都不會堵塞。客戶端寫後立即返回,不管服務端是否接收到,接收後是否處理完成。下一章,我們將會從程式碼的角度來研究一下Netty中對OIO和NIO這兩種模式下worker的處理方式。