Netty框架基礎----NIO非阻塞式IO介紹,示意圖和demo實例
標簽: Netty
一.NIO介紹
-
Java NIO 全稱 java non-blocking IO,是指 JDK 從 JDK1.4 開始提供的新 API。Java 提供了一系列改進的輸入/輸出的新特性,被統稱為 NIO(即 New IO),是同步非阻塞的
-
NIO 相關類都被放在 java.nio 包及子包下,并且對原 java.io 包中的很多類進行改寫
-
NIO 有三大核心部分:Channel(通道),Buffer(緩沖區), Selector(選擇器)
NIO是 面向緩沖區 ,或者面向 塊 編程的。數據讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動,這就增加了處理過程中的靈活性,使用它可以提供非阻塞式的高伸縮性網絡。滿足我們在高并發環境下的生產需求。
二.NIO和BIO比較
- BIO 以流的方式處理數據,而 NIO 以塊的方式處理數據,塊 I/O 的效率比流 I/O 高很多
- BIO 是阻塞的,NIO 則是非阻塞的
- BIO基于字節流和字符流進行操作,而 NIO 基于 Channel(通道)和 Buffer(緩沖區)進行操作,數據總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中。Selector(選擇器)用于監聽多個通道的事件(比如:連接請求,數據到達等),因此使用單個線程就可以監聽多個客戶端通道
三.NIO三大核心的原理示意圖
- 每個channel 都會對應一個Buffer
- Selector 對應一個線程, 一個線程對應多個channel(連接)
- 程序切換到哪個channel 是由事件Event決定的, Event 是一個重要的概念。Selector 會根據不同的事件,在各個通道上切換
- 數據的讀取寫入是通過Buffer, 這個和BIO , BIO 中要么是輸入流,或者是 輸出流, 不能雙向,但是NIO的Buffer 是可以讀也可以寫, 需要 flip 方法切換
緩沖區(Buffer)
- 緩沖區(Buffer):緩沖區本質上是一個可以讀寫數據的內存塊,可以理解成是一個容器對象(含數組),該對象提供了一組方法,可以更輕松地使用內存塊,緩沖區對象內置了一些機制,能夠跟蹤和記錄緩沖區的狀態變化情況。Channel 提供從文件、網絡讀取數據的渠道,但是讀取或寫入的數據都必須經由 Buffer
Buffer頂層抽象類的重要變量
所有繼承Buffer的子類都有這四個參數
Buffer基本函數用法示例
put:寫數據
get:讀數據
flip():讀寫切換
position(int i):定位buffer
public static void main(String[] args) {
//創建一個Buffer, 大小為 5, 即可以存放5個int
IntBuffer intBuffer = IntBuffer.allocate(5);
//向buffer 存放數據 存放了 0 2 4 6 8
for(int i = 0; i < intBuffer.capacity(); i++) {
intBuffer.put( i * 2);
}
//將buffer轉換,讀寫切換(!!!)
intBuffer.flip();//將buffer的讀寫狀態切換 從寫--->讀
intBuffer.position(1);//position函數能定位buffer的索引位置 設置為1則索引為1 對應的數字是2
System.out.println(intBuffer.get());//輸出2
intBuffer.limit(3);
while (intBuffer.hasRemaining()) {
System.out.println(intBuffer.get());
}
}
通道(Channel)
NIO的通道類似于流,但有些區別如下:
- 通道可以同時進行讀寫,而流只能讀或者只能寫
- 通道可以實現異步讀寫數據
- 通道可以從緩沖讀數據,也可以寫數據到緩沖
Channel在NIO中是一個接口
public interface Channel extends AttributeMap, ChannelOutboundInvoker, Comparable<Channel>
常用的 Channel 類有:FileChannel、DatagramChannel、ServerSocketChannel 和 SocketChannel。【ServerSocketChanne 類似 ServerSocket , SocketChannel 類似 Socket】
智能推薦
JVM底層存儲示意圖
一、正如我們所知道的,在java中一切事物皆對象,那么讓我們從類開始說起,一開始,我們都會從如下代碼開始: 但是底層究竟是怎么運轉的,初學者都會很迷茫,我也是如此,后來在學習的時候,才漸漸明白,其實所謂的類和對象,就是一個東西,只不過這個玩意兒,很特別,在你編碼的時候,所謂的class就是一個邏輯模型,專門讓程序員看的,在運行的時候就會變成物理結構,占用實際的內存空間,做真實的事情。 列表內容我很...
HDFS SecondaryNameNode CheckPoint流程示意圖
為什么需要CheckPoint? NN和2NN工作機制: 思考:NameNode中的元數據是存儲在哪里的? 首先,我們做個假設,如果存儲在NameNode節點的磁盤中,因為經常需要進行隨機訪問,還有響應客戶請求,必然是效率過低。因此,元數據需要存放在內存中。但如果只存在內存中,一旦斷電,元數據丟失,整個集群就無法工作了。因此產生在磁盤中備份元數據的FsImage。 這樣又會帶來新的問題,當在內存中...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...