Java技術分享:NIO實戰教程!

千鋒武漢發表於2021-06-07

  Java NIO(New IO)是一個可以替代標準Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標準IO不同的IO工作方式。NIO可以理解為非阻塞IO,傳統的IO的read和write只能阻塞執行,執行緒在讀寫IO期間不能幹其他事情,比如呼叫socket.read()時,如果伺服器一直沒有資料傳輸過來,執行緒就一直阻塞,而NIO中可以配置socket為非阻塞模式。

  Java NIO是在jdk1.4開始使用的,它既可以說成“新I/O”,也可以說成非阻塞式I/O。

  下面是java NIO的工作原理:

  1.由一個專門的執行緒來處理所有的IO事件,並負責分發。

  2.事件驅動機制:事件到的時候觸發,而不是同步的去監視事件。

  3.執行緒通訊:執行緒之間透過wait,notify等方式通訊。保證每次上下文切換都是有意義的。減少無謂的程式切換。

  閱讀過一些資料之後,下面貼出我理解的java NIO的工作原理圖:

1

  (注:每個執行緒的處理流程大概都是讀取資料、解碼、計算處理、編碼、傳送響應。)

  Java NIO的服務端只需啟動一個專門的執行緒來處理所有的IO事件,這種通訊模型是怎麼實現的呢?我們一起來探究它的奧秘吧。java NIO採用了雙向通道(channel)進行資料傳輸,而不是單向的流(stream),在通道上可以註冊我們感興趣的事件。一共有以下四種事件:

  事件名對應值:

  服務端接收客戶端連線事件 SelectionKey.OP_ACCEPT(16)

  客戶端連線服務端事件 SelectionKey.OP_CONNECT(8)

  讀事件 SelectionKey.OP_READ(1)

  寫事件 SelectionKey.OP_WRITE(4)

  在NIO中有三大核心元件:Channel,Buffer,Selector,傳統的IO面向流的,每次可以從流中讀取一個或多個位元組,只能向後讀取,不能向前移動,NIO是面向緩衝區的,把資料讀到一個緩衝區中,可以在緩衝區中向前/向後移動,增加了程式的靈活性。在NIO中,所有的陣列都需要透過Channel傳輸,通道可以直接將一塊資料對映到記憶體中。Channel是雙向的,不僅可以讀取資料,還能儲存資料,程式不能直接讀寫Channel通道,Channel只與Buffer緩衝區互動。

  希望以上的分享能幫到大家!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2775820/,如需轉載,請註明出處,否則將追究法律責任。

相關文章