成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java NIO 入門

liaorio / 2111人閱讀

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

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

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

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

select

poll

epoll

kqueue

IOCP

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

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

Channel & ByteBuffer vs Stream

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

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

Selector eventSelector = Selector.open();

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

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

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

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 對于客戶端的優(yōu)勢幾乎沒有,但是可以讓代碼更好管理; 如果這時候你使用的是ServerSocket,好處就立馬體現(xiàn)了,因為你的業(yè)務(wù)需求很可能是這樣:

master 線程,開啟 accept.

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

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

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

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

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

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/66687.html

相關(guān)文章

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

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

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

    時間: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ū)動、異步非阻塞的IO Java開源框架 基于NIO的客戶...

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

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

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

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

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

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

    ddongjian0000 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<