大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) 學(xué)習(xí)Java編程,NIO你是否有了解

學(xué)習(xí)Java編程,NIO你是否有了解

更新時間:2020-09-07 16:35:51 來源:動力節(jié)點 瀏覽2219次

很多人在學(xué)習(xí)NIO的時候都會忽略一些小細節(jié),而這些細節(jié)正巧就是NIO網(wǎng)絡(luò)編程中必不可少的。今天就來跟小編一起了解真正的NIO。

學(xué)習(xí)Java編程,NIO你是否有了解

NIO 是一種同步非阻塞的 IO 模型。同步是指線程不斷輪詢 IO 事件是否就緒,非阻塞是指線程在等待 IO 的時候,可以同時做其他任務(wù)。同步的核心就是 Selector,Selector 代替了線程本身輪詢 IO 事件,避免了阻塞同時減少了不必要的線程消耗;非阻塞的核心就是通道和緩沖區(qū),當(dāng) IO 事件就緒時,可以通過寫道緩沖區(qū),保證 IO 的成功,而無需線程阻塞式地等待。

Buffer:

為什么說NIO是基于緩沖區(qū)的IO方式呢?因為,當(dāng)一個鏈接建立完成后,IO的數(shù)據(jù)未必會馬上到達,為了當(dāng)數(shù)據(jù)到達時能夠正確完成IO操作,在BIO(阻塞IO)中,等待IO的線程必須被阻塞,以全天候地執(zhí)行IO操作。為了解決這種IO方式低效的問題,引入了緩沖區(qū)的概念,當(dāng)數(shù)據(jù)到達時,可以預(yù)先被寫入緩沖區(qū),再由緩沖區(qū)交給線程,因此線程無需阻塞地等待IO。

通道:

當(dāng)執(zhí)行:SocketChannel.write(Buffer),便將一個buffer寫到了一個通道中。如果說緩沖區(qū)還好理解,通道相對來說就更加抽象。網(wǎng)上博客難免有寫不嚴(yán)謹(jǐn)?shù)牡胤剑菀资钩鯇W(xué)者感到難以理解。

引用Java NIO中權(quán)威的說法:通道是I/O傳輸發(fā)生時通過的入口,而緩沖區(qū)是這些數(shù)據(jù)傳輸?shù)膩碓椿蚰繕?biāo)。對于離開緩沖區(qū)的傳輸,您想傳遞出去的數(shù)據(jù)被置于一個緩沖區(qū),被傳送到通道。對于傳回緩沖區(qū)的傳輸,一個通道將數(shù)據(jù)放置在您所提供的緩沖區(qū)中。

例如有一個服務(wù)器通道ServerSocketChannel serverChannel,一個客戶端通道SocketChannel clientChannel;服務(wù)器緩沖區(qū):serverBuffer,客戶端緩沖區(qū):clientBuffer。

當(dāng)服務(wù)器想向客戶端發(fā)送數(shù)據(jù)時,需要調(diào)用:clientChannel.write(serverBuffer)。當(dāng)客戶端要讀時,調(diào)用clientChannel.read(clientBuffer)

當(dāng)客戶端想向服務(wù)器發(fā)送數(shù)據(jù)時,需要調(diào)用:serverChannel.write(clientBuffer)。當(dāng)服務(wù)器要讀時,調(diào)用serverChannel.read(serverBuffer)

這樣,通道和緩沖區(qū)的關(guān)系似乎更好理解了。在實踐中,未必會出現(xiàn)這種雙向連接的蠢事(然而這確實存在的,后面的內(nèi)容還會涉及),但是可以理解為在NIO中:如果想將Data發(fā)到目標(biāo)端,則需要將存儲該Data的Buffer,寫入到目標(biāo)端的Channel中,然后再從Channel中讀取數(shù)據(jù)到目標(biāo)端的Buffer中。

Selector:

通道和緩沖區(qū)的機制,使得線程無需阻塞地等待IO事件的就緒,但是總是要有人來監(jiān)管這些IO事件。這個工作就交給了selector來完成,這就是所謂的同步。

Selector允許單線程處理多個Channel。如果你的應(yīng)用打開了多個連接(通道),但每個連接的流量都很低,使用Selector就會很方便。

要使用Selector,得向Selector注冊Channel,然后調(diào)用它的select()方法。這個方法會一直阻塞到某個注冊的通道有事件就緒,這就是所說的輪詢。一旦這個方法返回,線程就可以處理這些事件。

Selector中注冊的感興趣事件有:

OP_ACCEPT

OP_CONNECT

OP_READ

OP_WRITE

優(yōu)化:

一種優(yōu)化方式是:將Selector進一步分解為Reactor,將不同的感興趣事件分開,每一個Reactor只負責(zé)一種感興趣的事件。這樣做的好處是:1、分離阻塞級別,減少了輪詢的時間;2、線程無需遍歷set以找到自己感興趣的事件,因為得到的set中僅包含自己感興趣的事件。

NIO和epoll:

epoll是Linux內(nèi)核的IO模型。我想一定有人想問,AIO聽起來比NIO更加高大上,為什么不使用AIO?AIO其實也有應(yīng)用,但是有一個問題就是,Linux是不支持AIO的,因此基于AIO的程序運行在Linux上的效率相比NIO反而更低。而Linux是最主要的服務(wù)器OS,因此相比AIO,目前NIO的應(yīng)用更加廣泛。

說到這里,可能你已經(jīng)明白了,epoll一定和NIO有著很深的因緣。沒錯,如果仔細研究epoll的技術(shù)內(nèi)幕,你會發(fā)現(xiàn)它確實和NIO非常相似,都是基于“通道”和緩沖區(qū)的,也有selector,只是在epoll中,通道實際上是操作系統(tǒng)的“管道”。和NIO不同的是,NIO中,解放了線程,但是需要由selector阻塞式地輪詢IO事件的就緒;而epoll中,IO事件就緒后,會自動發(fā)送消息,通知selector:“我已經(jīng)就緒了。”可以認為,Linux的epoll是一種效率更高的NIO。

動力節(jié)點Java NIO視頻教程以準(zhǔn)備就緒,即將上線,想學(xué)習(xí)的同學(xué),可以留意下動力節(jié)點視頻教程下載專欄。

學(xué)習(xí)Java編程,NIO你是否有了解

以上就是動力節(jié)點java培訓(xùn)機構(gòu)的小編針對“學(xué)習(xí)Java編程,NIO你是否有了解”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 99精品国产兔费观看久久99 | 日本中文在线观看 | 亚洲精品69 | japanese55成熟丰满熟 | 亚洲精品一区久久狠狠欧美 | 久草视频免费在线观看 | 亚洲精品动漫3d一区二区 | 国产亚洲片 | 99热这里只有精品国产免费 | 亚洲玖玖 | 日本成人中文字幕 | 久久中文字幕一区二区 | 日日摸夜夜嗷嗷叫日日拍 | 欧美日韩中文字幕 | 国产中文一区 | 奇米影视狠狠久久中文 | 天天拍夜夜添久久精品免费 | 日韩欧美在线播放 | 国产一级毛片欧美视频 | 黄色成人在线观看 | 天天艹夜夜艹 | 拍拍拍精品视频在线观看 | 天天操天天曰 | 久久国产精品亚洲一区二区 | 亚洲狠狠婷婷综合久久久图片 | 日韩精品影视 | 香蕉视频免费在线观看 | 精品特级一级毛片免费观看 | 中文字幕久久精品 | 亚洲高清在线观看视频 | 伊人色综 | 欧美日韩一本大道香蕉欧美 | 亚洲精品视频免费在线观看 | 日韩大乳视频中文字幕 | 内衣办公室动漫久久影院 | 国产精品成 | 日韩一区二区中文字幕 | 久久se精品一区二区国产 | 色综合久久一本首久久 | 日韩欧美手机在线 | 91日韩|