摘要:關(guān)于多路復(fù)用很多人用過和接口,用來操作文件等等操作。熟悉操作系統(tǒng)的人會(huì)知道,操作非阻塞無(wú)非幾種多路復(fù)用這里的復(fù)用模型有幾個(gè)是操作系統(tǒng)相關(guān)的也就是說,并不是所有的操作系統(tǒng)都可以用,典型的就是是的專利,是的專利比如。
關(guān)于多路復(fù)用
很多人用過InputStream和OutputStream接口,用來操作文件、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)都可以用,典型的就是IOCP是Windows的"專利",kqueue是BSD的"專利"(比如macOS)。
那么 java 作為一門跨平臺(tái)的語(yǔ)言解決方案,是如何在虛擬機(jī)上使用 non-blocking IO 的呢?
具體的實(shí)現(xiàn)我們可以不管,它使用了Selector的 API,調(diào)用方式非常類似select。
在nio中,不再使用Stream API對(duì)Socket進(jìn)行交互,而是使用Channel和ByteBuffer進(jìn)行交互,
Channel負(fù)責(zé)管道的工作,ByteBuffer負(fù)責(zé)緩存的工作。
原先InputStream和OutputStream的工作就由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總結(jié)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(); } }
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
摘要:的選擇器允許單個(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之...
時(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的客戶...
摘要:好了,目前還不難,我們起碼知道這個(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è)線性...
摘要:表示的是兩個(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è)名詞,今天我們首先來說說分布式。 探究...
摘要:表示的是兩個(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è)名詞,今天我們首先來說說分布式。 探究...
閱讀 1501·2023-04-25 15:40
閱讀 2885·2021-08-11 11:15
閱讀 2285·2019-08-26 13:48
閱讀 2861·2019-08-26 12:18
閱讀 2461·2019-08-23 18:23
閱讀 2916·2019-08-23 17:01
閱讀 2990·2019-08-23 16:29
閱讀 1109·2019-08-23 15:15