Java技术分享:NIO实战教程!
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的工作原理圖:
(注:每個線程的處理流程大概都是讀取數據、解碼、計算處理、編碼、發送響應。)
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緩沖區交互。
希望以上的分享能幫到大家!本文來自千鋒教育,轉載請注明出處。
總結
以上是生活随笔為你收集整理的Java技术分享:NIO实战教程!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java进阶书籍推荐,赶快收藏起来!
- 下一篇: 容易忽视的十大SQL优化方案!