成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java NIO 入門

liaorio / 2072人閱讀

摘要:關(guān)于多路復(fù)用很多人用過和接口,用來操作文件等等操作。熟悉操作系統(tǒng)的人會(huì)知道,操作非阻塞無(wú)非幾種多路復(fù)用這里的復(fù)用模型有幾個(gè)是操作系統(tǒng)相關(guān)的也就是說,并不是所有的操作系統(tǒng)都可以用,典型的就是是的專利,是的專利比如。

關(guān)于多路復(fù)用

很多人用過InputStreamOutputStream接口,用來操作文件、Socket等等 IO 操作。
如果是簡(jiǎn)單的,速度較快的 IO 操作,我們用Stream類的接口,依然可以風(fēng)生水起。
如果你要使用非阻塞的 IO 的話,他們可能就滿足不了你了。

熟悉操作系統(tǒng)的人會(huì)知道,操作非阻塞 IO 無(wú)非幾種多路復(fù)用:

select

poll

epoll

kqueue

IOCP

這里的復(fù)用模型有幾個(gè)是操作系統(tǒng)相關(guān)的——也就是說,并不是所有的操作系統(tǒng)都可以用,典型的就是IOCPWindows的"專利",kqueueBSD的"專利"(比如macOS)。

那么 java 作為一門跨平臺(tái)的語(yǔ)言解決方案,是如何在虛擬機(jī)上使用 non-blocking IO 的呢?
具體的實(shí)現(xiàn)我們可以不管,它使用了Selector的 API,調(diào)用方式非常類似select。

Channel & ByteBuffer vs Stream

nio中,不再使用Stream API對(duì)Socket進(jìn)行交互,而是使用ChannelByteBuffer進(jìn)行交互,
Channel負(fù)責(zé)管道的工作,ByteBuffer負(fù)責(zé)緩存的工作。

原先InputStreamOutputStream的工作就由Channel做掉了,如果這個(gè)Channel支持Select模型的話,它就是SelectableChannel的子類。
那么,在消息循環(huán)的模型中,首先要建立循環(huán),像我們的Looper.loop()一樣,我們先用Selector.open()新建一個(gè)Selector

Selector eventSelector = Selector.open();

// 設(shè)置這個(gè) channel 是非阻塞的
socketChannel.configureBlocking(false);

// 注冊(cè)到 selector 里,并設(shè)置好關(guān)心的事件
socketSelectionKey = socketChannel.register(eventSelector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
Selector

接下來調(diào)用 eventSelector.select() 阻塞,就能在你關(guān)心的事件到來的時(shí)候,阻塞就會(huì)被喚醒,處理事件。

sample:

while (connected) {
    eventSelector.select();
    Set keys = eventSelector.selectedKeys();
    Iterator iterator = keys.iterator();
    while (iterator.hasNext()) {
        SelectionKey key = iterator.next();
        if (key.isReadable()) {
            // 當(dāng) socket 可讀
            internalOnRead((ReadableByteChannel) key.channel());
        }

        if (key.isWritable()) {
            // 當(dāng) socket 可寫
            internalOnWrite((WritableByteChannel) key.channel());
        }
        iterator.remove();
    }
}
總結(jié)

nio 對(duì)于客戶端的優(yōu)勢(shì)幾乎沒有,但是可以讓代碼更好管理; 如果這時(shí)候你使用的是ServerSocket,好處就立馬體現(xiàn)了,因?yàn)槟愕臉I(yè)務(wù)需求很可能是這樣:

master 線程,開啟 accept.

如果有客戶接入,開啟一個(gè) worker,用來服務(wù) client。

服務(wù)完后,保持或者關(guān)閉這個(gè)連接。

(這個(gè)業(yè)務(wù)模型類似Apache httpd)這樣的業(yè)務(wù)模型可能導(dǎo)致過多的線程開銷,使得并發(fā)量并不高。

那么,老生常談的event-driven的模型在java中,就差不多是這樣的邏輯:

master 線程,開啟 selector, 并為 ServerSocket 注冊(cè) accept, read, write 等事件。

客戶接入,為 client socket 注冊(cè) read, write 事件,依舊在該線程里面進(jìn)行循環(huán)。

當(dāng) event trigger 的時(shí)候,處理相關(guān)業(yè)務(wù)邏輯。

第二個(gè)模型只啟動(dòng)了一個(gè)線程,所有的IO操作都在 OS 里面完成了,用戶空間內(nèi)的資源消耗大大降低,這也是我們把 Server 端的 IO 改成 nio 的優(yōu)勢(shì)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66687.html

相關(guān)文章

  • 少啰嗦!一分鐘帶你讀懂JavaNIO和經(jīng)典IO的區(qū)別

    摘要:的選擇器允許單個(gè)線程監(jiān)視多個(gè)輸入通道。一旦執(zhí)行的線程已經(jīng)超過讀取代碼中的某個(gè)數(shù)據(jù)片段,該線程就不會(huì)在數(shù)據(jù)中向后移動(dòng)通常不會(huì)。 1、引言 很多初涉網(wǎng)絡(luò)編程的程序員,在研究Java NIO(即異步IO)和經(jīng)典IO(也就是常說的阻塞式IO)的API時(shí),很快就會(huì)發(fā)現(xiàn)一個(gè)問題:我什么時(shí)候應(yīng)該使用經(jīng)典IO,什么時(shí)候應(yīng)該使用NIO? 在本文中,將嘗試用簡(jiǎn)明扼要的文字,闡明Java NIO和經(jīng)典IO之...

    Meils 評(píng)論0 收藏0
  • 慕課網(wǎng)_《Netty入門之WebSocket初體驗(yàn)》學(xué)習(xí)總結(jié)

    時(shí)間:2018年04月11日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:https://github.com/zccodere/s... 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅(qū)動(dòng)、異步非阻塞的IO Java開源框架 基于NIO的客戶...

    Noodles 評(píng)論0 收藏0
  • 【源碼閱讀】Java-NIO之Selector創(chuàng)建過程詳解

    摘要:好了,目前還不難,我們起碼知道這個(gè)抽象類上面的部分關(guān)系,因此當(dāng)然也有自己的方法,如下。又來一個(gè)的供應(yīng)商好吧,大佬們總是喜歡用一些設(shè)計(jì)模式的東西,沒錯(cuò),也是一個(gè)抽象類,這個(gè)現(xiàn)在不用太在意了。 前言 java nio,一個(gè)入門netty之前需要了解下的非阻塞I/O實(shí)現(xiàn),傳統(tǒng)的Socket通信,啟動(dòng)監(jiān)聽后accept會(huì)一直處于阻塞狀態(tài),那么如果你想要多個(gè)(并發(fā))通信時(shí),那么我們就需要多個(gè)線性...

    187J3X1 評(píng)論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂茫陂_始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來?yè)羝魄皟蓚€(gè)名詞,今天我們首先來說說分布式。 探究...

    supernavy 評(píng)論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂?,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來?yè)羝魄皟蓚€(gè)名詞,今天我們首先來說說分布式。 探究...

    ddongjian0000 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<