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緩衝區互動。
希望以上的分享能幫到大家!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2775820/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 最新Java培訓-NIO實戰教程Java
- 技術管理實戰36講教程
- javaNIO實戰4----> java NIO的通道Channel實戰Java
- 【譯】Java NIO 簡明教程系列之 NIO 概述Java
- Java NIO 簡明教程系列Java
- Java NIO系列教程(二) ChannelJava
- Java NIO系列教程(六) SelectorJava
- Java NIO系列教程(七) FileChannelJava
- 好程式設計師Java教程分享Java技術知識點總結程式設計師Java
- 【譯】Java NIO 簡明教程系列之 NIO 簡介Java
- 好程式設計師Java教程分享Java面試常見技術難題程式設計師Java面試
- AI考拉技術分享--布隆過濾器實戰AI過濾器
- Java技術分享:Java基本資料型別Java資料型別
- Java技術分享:Java的執行機制Java
- Java技術分享之變數命名Java變數
- 爬蟲技術實戰爬蟲
- 【譯】Java8官方教程:Java技術概述Java
- Cocos 技術派:實時競技小遊戲技術實現分享遊戲
- Python技術分享:numpy庫的安裝教程Python
- 技術大牛分享:JAVA學習路線Java
- Java技術分享:小白如何入門Mybatis?JavaMyBatis
- 【譯】Java NIO 簡明教程系列之 ChannelJava
- 好程式設計師Java教程分享面試中Spring的技術問題程式設計師Java面試Spring
- Flutter核心技術與實戰Flutter
- 開發技術分享:美團R語言資料運營實戰!R語言
- 前端技術分享:Nginx負載均衡影片,基礎的實戰應用前端Nginx負載
- Java技術分享:void的用法和意義Java
- Java技術分享:SpringBoot多模組開發JavaSpring Boot
- Java NIOJava
- Hybrid App技術解析 — 實戰篇APP
- Hybrid App技術解析 -- 實戰篇APP
- 【SpringBoot實戰】檢視技術-ThymeleafSpring Boot
- web技術分享| 虛擬列表實現Web
- 最新技術精選|千鋒React教程+實戰全集資源免費領React
- Java培訓教程之使用Jsoup實現簡單的爬蟲技術JavaJS爬蟲
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- SpEL應用實戰|得物技術
- Jenkins技術概述與開發實戰Jenkins