NIO流原理解析

在 JDK1.4 之後,爲了提高 Java IO 的效率,Java 又提供了一套 New IO(NIO),原因在於它相對於之前的 IO 類庫是新增的。此外,舊的 IO 類庫提供的 IO 方法是阻塞的,New IO 類庫則讓 Java 可支持非阻塞 IO,所以,更多的人喜歡稱之爲非阻塞 IO(Non-blocking IO)。

一、NIO網絡模型

1、NIO網絡模型猜想?

  • Acceptor:接受客戶端連接請求。
  • 當客戶端有連接請求之後,服務端會創建一個scoket,將它放入一個set集合中,然後遍歷這個set集合,一直調用read方法,當read方法沒有數據返回或者返回空的時候,說明沒有數據到達,就不用去處理,當read方法返回有數據說明請求到客戶端請求過來的連接,這時候就會調用handler方法來處理具體的業務員邏輯。
  • 多個客戶請求過來都會放在set集合中,handler一個方法來一次處理所有的客戶端請求。

2、具體的請求過程

第一步:

在選擇器上註冊建立連接事件

第二步:

當客戶端向服務端發送建立連接請求時,selector就會檢測到這個連接請求的事件,然後selector就會建立啓動一個建立連接事件的處理器。

第三步:

然後與客戶端創建一個scoket的連接,並且響應客戶端成功的請求,然後acceptor hander方法會將新創建的scoket的連接註冊到selector,並且註冊read事件也就是可讀事件

第四步:

當客戶發送請求到服務端,這時候selector就會監聽到它的一個可讀事件,這時候selector就會啓動一個連接讀寫處理器,然後通過read&write Handler方法響應客戶端的請求,返回給客戶端,這時候還會將註冊的連接可讀事件 註冊到selector上。

selector:多路複用選擇器,它是一個核心,它的主要功能就是接受所有的與客戶端建立的scoket連接,並且監聽他們所關心的事件,當這個事件發生之後,就會調用相應的事件處理器來處理這個事件。

二、NIO網絡編程詳解

NIO的核心類

  • Channel:通道
  • Buffer:緩衝區
  • Selector:選擇器或多路複用器

1、Channel(通道)

Channel的特性:

  • 雙向性
  • 非阻塞性
  • 操作唯一性(只能通過buffer來操作)

Channel實現類:

文件類,

UDP類,

TCP類

Channel通道的具體使用:

2、Buffer(緩衝區)

作用:讀寫Channel中的數據

本質:一塊內存區域

(1)、buffer屬性

  • Capacity:容量
  • Position:位置
  • Limit:上限
  • Mark:標記

(2)、buffer的使用(也就是圍繞這個4個屬性變化的過程)

   

 

3、Selector(選擇器或多路複用器)

作用:I/O就緒選擇

地位:NIO網絡編程的基礎

(1)、selector的使用

三、BIO與NIO對比

IO模型 IO NIO
方式 從硬盤到內存 從內存到硬盤
通信 面向流(鄉村公路) 面向緩存(高速公路,多路複用技術)
處理 阻塞IO(多線程) 非阻塞IO(反應堆Reactor)
觸發

選擇器(輪詢機制)

 

1、面向流與面向緩衝:

Java NIO和IO之間第一個最大的區別是,IO是面向流的.NIO是面向緩衝區的。Java IO面向流意味着毎次從流中讀一個成多個字節,直至讀取所有字節,它們沒有被緩存在任何地方,此外,它不能前後移動流中的數據。如果需要前後移動從流中讀取的教據,需要先將它緩存到一個緩衝區。Java NIO的緩衝導向方法略有不同。數據讀取到一個它稍後處理的緩衝區,霱要時可在緩衝區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩衝區中包含所有您需要處理的數裾。而且,需確保當更多的數據讀入緩衝區時,不要覆蓋緩衝區裏尚未處理的數據。
 

2、阻塞與非阻塞:

Java IO的各種流是阻塞的。這意味着,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再幹任何事情了。 Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什麼都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。 非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閒時間用於在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。

 

3、選擇器(Selector):

Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以註冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇"通道:這些通裏已經有可以處理的褕入,或者選擇已準備寫入的通道。這選懌機制,使得一個單獨的線程很容易來管理多個通道。

 

4、NIO和BIO讀取文件:

BIO讀取文件:鏈接

BIO從一個阻塞的流中一行一行的讀取數據。

 

5、處理數據的線程數:

NIO:一個線程管理多個連接
BIO:一個線程管理一個連接

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章