Java NIO與Java BIO的區(qū)別是什么?

1柬唯、什么是Java NIO?

同步非阻塞io模式认臊,拿燒開水來說,NIO的做法是叫一個線程不斷的輪詢每個水壺的狀態(tài)锄奢,看看是否有水壺的狀態(tài)發(fā)生了改變失晴,從而進行下一步的操作。

Java NIO有三大組成部分:Buffer拘央;Channel涂屁;Selector。

通過事件驅(qū)動模式實現(xiàn)了什么時候有數(shù)據(jù)可讀的問題灰伟。? Channel:相當于IO操作的載體拆又,相當于一個硬件設(shè)備儒旬,一個文件,一個socket或是區(qū)別程序中的不同IO操作帖族,如read栈源,write。

channel類似流竖般,但又有些不同:? 既可以從通道中讀取數(shù)據(jù)甚垦,又可以寫數(shù)據(jù)到通道。但流的讀寫通常是單向的涣雕。? 通道可以異步地讀寫艰亮。? 通道中的數(shù)據(jù)總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入挣郭。

Buffer:用于和NIO通道進行交互迄埃。如你所知,數(shù)據(jù)是從通道讀入緩沖區(qū)丈屹,從緩沖區(qū)寫入到通道中的调俘。? 緩沖區(qū)本質(zhì)上是一塊可以寫入數(shù)據(jù),然后可以從中讀取數(shù)據(jù)的內(nèi)存旺垒。這塊內(nèi)存被包裝成NIO Buffer對象彩库,并提供了一組方法,用來方便的訪問該塊內(nèi)存先蒋。? channel 和 buffer 之間的交互如下:

Selector:Selector(選擇器)是Java NIO中能夠檢測一到多個NIO通道骇钦,通道將關(guān)心的事件注冊到selector 上,selector能夠知曉通道是否為這些事件諸如讀寫事件做好數(shù)據(jù)準備竞漾。這樣眯搭,一個單獨的線程可以管理多個channel,從而管理多個網(wǎng)絡(luò)連接业岁。

2鳞仙、什么是Java BIO?

同步阻塞IO模式,數(shù)據(jù)的讀取寫入必須阻塞在一個線程內(nèi)等待其完成笔时。這里使用那個經(jīng)典的燒開水例子棍好,這里假設(shè)一個燒開水的場景,有一排水壺在燒開水允耿,BIO的工作模式就是借笙, 叫一個線程停留在一個水壺那,直到這個水壺燒開较锡,才去處理下一個水壺业稼。但是實際上線程在等待水壺燒開的時間段什么都沒有做。不知道io操作中什么時候有數(shù)據(jù)可讀蚂蕴,所以一直是阻塞的模式低散。

3俯邓、區(qū)別及應(yīng)用

主要區(qū)別:

兩種模式的差異對比:

首先,線程是較為重量級的資源谦纱。bio當并發(fā)量大看成,而后端服務(wù)或客戶端處理數(shù)據(jù)慢時就會產(chǎn)生產(chǎn)生大量線程處于等待中,即上述的阻塞跨嘉,是非常嚴重的資源浪費川慌。

此外,線程的切換也會導(dǎo)致cpu資源的浪費祠乃,單機內(nèi)存限制也無法過多的線程梦重,只能單向以流的形式讀取數(shù)據(jù)。

nio使用單線程或者只使用少量的多線程亮瓷,多個連接共用一個線程琴拧,消耗的線程資源會大幅減小。并且當處于等待(沒有事件)的時候線程資源可以釋放出來處理別的請求嘱支,通過事件驅(qū)動模型當有accept/read/write等事件發(fā)生后通知(喚醒)主線程分配資源來處理相關(guān)事件蚓胸。以buffer緩沖區(qū)的形式處理數(shù)據(jù),處理更為方便除师。

nio server demo:

Selector selector = Selector.open();?

ServerSocketChannel ssc = ServerSocketChannel.open();?

ssc.configureBlocking(false);?

ssc.socket().bind(new InetSocketAddress(port));?


ssc.register(selector, SelectionKey.OP_ACCEPT);?


while (true) {?


? ? // select()阻塞沛膳,等待有事件發(fā)生喚醒?

? ? int selected = selector.select();?


? ? if (selected > 0) {?

? ? ? ? Iterator<SelectionKey> selectedKeys = selector.selectedKeys().iterator();?

? ? ? ? while (selectedKeys.hasNext()) {?

? ? ? ? ? ? SelectionKey key = selectedKeys.next();?

? ? ? ? ? ? if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {?

? ? ? ? ? ? ? SocketChannel client = ((ServerSocketChannel) key.channel()).accept();

? ? ? ? ? ? ? ? // 處理 accept 事件?

? ? ? ? ? ? ? ? //注冊read事件

? ? ? ? ? ? ? ? client.configureBlocking(false);

? ? ? ? ? ? ? ? client.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufSize));

? ? ? ? ? ? } else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {?

? ? ? ? ? ? ? ? // 處理 read 事件?

? ? ? ? ? ? ? //注冊write事件

? ? ? ? ? ? } else if ((key.readyOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE) {?

? ? ? ? ? ? ? ? // 處理 write 事件?

? ? ? ? ? ? }?

? ? ? ? ? ? selectedKeys.remove();?

? ? ? ? }?

? ? }?

}

bio server demo:

ServerSocket serverSocket;

? ? ? ? try {

? ? ? ? ? ? serverSocket = new ServerSocket(8000);

? ? ? ? ? ? while (true){

? ? ? ? ? ? ? ? Socket socket = serverSocket.accept();

? ? ? ? ? ? ? ? new Thread(()->{

? ? ? ? ? ? ? ? ? ? try (InputStream inputStream = socket.getInputStream(); OutputStream outputStream =? socket.getOutputStream()) {

? ? ? ? ? ? ? ? ? ? ? ? byte[] bytes =new byte[1024];

? ? ? ? ? ? ? ? ? ? ? ? while (inputStream.read(bytes) != -1){

? ? ? ? ? ? ? ? ? ? ? ? ? ? outputStream.write(bytes);

? ? ? ? ? ? ? ? ? ? ? ? ? ? bytes = new byte[1024];

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }catch (IOException e){

? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }).start();

? ? ? ? ? ? }

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

4、Java學習視頻

Java基礎(chǔ):

Java300集汛聚,Java必備優(yōu)質(zhì)視頻_手把手圖解學習Java锹安,讓學習成為一種享受

Java項目:

【Java游戲項目】1小時教你用Java語言做經(jīng)典掃雷游戲_手把手教你開發(fā)游戲

【Java畢業(yè)設(shè)計】OA辦公系統(tǒng)項目實戰(zhàn)_OA員工管理系統(tǒng)項目_java開發(fā)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倚舀,隨后出現(xiàn)的幾起案子叹哭,更是在濱河造成了極大的恐慌,老刑警劉巖痕貌,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件风罩,死亡現(xiàn)場離奇詭異,居然都是意外死亡舵稠,警方通過查閱死者的電腦和手機泊交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱查,“玉大人,你說我怎么就攤上這事云石“ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵汹忠,是天一觀的道長淋硝。 經(jīng)常有香客問我雹熬,道長,這世上最難降的妖魔是什么谣膳? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任竿报,我火速辦了婚禮,結(jié)果婚禮上继谚,老公的妹妹穿的比我還像新娘烈菌。我一直安慰自己,他們只是感情好花履,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布芽世。 她就那樣靜靜地躺著,像睡著了一般诡壁。 火紅的嫁衣襯著肌膚如雪济瓢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天妹卿,我揣著相機與錄音旺矾,去河邊找鬼。 笑死夺克,一個胖子當著我的面吹牛箕宙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播懊直,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扒吁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了室囊?” 一聲冷哼從身側(cè)響起雕崩,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎融撞,沒想到半個月后盼铁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡尝偎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年饶火,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片致扯。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肤寝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抖僵,到底是詐尸還是另有隱情鲤看,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布耍群,位于F島的核電站义桂,受9級特大地震影響找筝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慷吊,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一袖裕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溉瓶,春花似錦急鳄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胞锰,卻和暖如春灾锯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗅榕。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工顺饮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凌那。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓兼雄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帽蝶。 傳聞我的和親對象是個殘疾皇子赦肋,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容