Java NIO框架Netty教程(十四)
OneCoder這個週末搬家,並且新家目前還沒有網路,本週的翻譯的任務尚未完成,下週一起補上,先上一篇OIO和NIO對比的小研究。
Netty中不光支援了Java中NIO模型,同時也提供了對OIO模型的支援。(New IO vs Old IO)。
首先,在Netty中,切換OIO和NIO兩種模式是非常方便的,只需要初始化不同的Channel工程即可。
ServerBootstrap bootstrap = new ServerBootstrap(
new OioServerSocketChannelFactory(
Executors.newCachedThreadPool (),
Executors.newFixedThreadPool(4)));
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newFixedThreadPool(4)));
這就是Netty框架為我們做的貢獻。
再說說,這兩種情況的區別。OneCoder根據網上的資料和自己的理解,總結了一下:在Netty中,是通過worker執行任務的。也就是我們在構造bootstrap
基於這個分析,你可能也發現了,上面的程式碼中我們用的是FiexedThreadPool。固定大小為4,從理論上來說,OIO支援的client數應該是4。而NIO應該不受此影響。測試效果如下圖:
8個Client連線:
NIOServer的執行緒情況:
並且8個Client的請求都正常處理了。
對於OIO來說,如果你對worker池沒有控制,那麼支援8個client需要8個worker,8個執行緒,這也就是傳統OIO併發數受限的原因,如圖:
當OIO使用FixedThreadPool的時候:
只能處理頭四個client的請求,他的被堵塞了。
Hello action.: 32
Hello action.: 33
Hello action.: 34
Hello action.: 35
Hello action.: 36
Hello action.: 37
Hello action.: 38
Hello action.: 39
Hello action.: 40
但是,在Netty框架中,不論是OIO和NIO模型,讀寫端都不會堵塞。客戶端寫後立即返回,不管服務端是否接收到,接收後是否處理完成。下一章,我們將會從程式碼的角度來研究一下Netty中對OIO和NIO這兩種模式下worker的處理方式。