日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

第一次听人用男女关系讲 N(Non-Blocking)I(进)O(出),涨姿势了

發(fā)布時(shí)間:2025/3/20 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一次听人用男女关系讲 N(Non-Blocking)I(进)O(出),涨姿势了 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
點(diǎn)擊上方?好好學(xué)java?,選擇?星標(biāo)?公眾號(hào)重磅資訊,干貨,第一時(shí)間送達(dá) 今日推薦:推薦19個(gè)github超牛逼項(xiàng)目!個(gè)人原創(chuàng)100W +訪問(wèn)量博客:點(diǎn)擊前往,查看更多

BIO:80 年代屌絲追妹

80 年代屌絲男買了一個(gè) BP 機(jī)用來(lái)追妹,男士使用傳呼臺(tái)給女生留言:

男:下午一起看個(gè)電影?[早晨 10 點(diǎn)]

這是男生唯一心動(dòng)的女生,所以一直守著自己的 BP 機(jī),等待女生回復(fù),就這樣一天過(guò)去了,直到:

男:BP 沒(méi)電,自動(dòng)關(guān)機(jī)。

名詞解釋

  • BP 機(jī)和傳呼臺(tái)指的是 BIO 中的流單向傳輸?shù)奶匦?#xff0c;屌絲男士通過(guò)傳呼臺(tái)給 BP 機(jī)發(fā)送消息是單向的,如果是女生通過(guò)傳呼臺(tái)回復(fù)屌絲男士,也是單向的。

  • 這個(gè)女生是男士唯一心動(dòng)的女生,所以他傻等著 BP 機(jī)回復(fù),即便可能一直不會(huì)有消息,這就是同步阻塞 IO,中 B 的概念。

  • BIO 的缺點(diǎn)

  • 同步阻塞 IO,如果存在多個(gè)請(qǐng)求的時(shí)候,服務(wù)端必須通過(guò)多線程處理,增加了服務(wù)端的壓力和創(chuàng)建銷毀線程的開(kāi)銷。

  • 如果連接一直沒(méi)有響應(yīng),服務(wù)端也需要一直監(jiān)聽(tīng)端口等待,浪費(fèi)了服務(wù)端資源。

  • NIO:80 年代公子哥把妹

    80 年代的公子哥買了一個(gè)大哥大,關(guān)鍵是這個(gè)公子哥太花心,同時(shí)中意了兩個(gè)妹子,于是他就開(kāi)始了把妹過(guò)程。
    公子哥用大哥大給女 A 打電話:

    公子哥 -> 女 A:下午一起看個(gè)電影?[早晨 10 點(diǎn)]
    女 A -> 公子哥:我正在吃飯,你晚點(diǎn)再打過(guò)來(lái)?

    公子哥用大哥大給女 B 打電話:

    公子哥 -> 女 B:下午一起看個(gè)電影?[早晨 10 點(diǎn) 1 分]
    女 B -> 公子哥:我正在吃飯,你晚點(diǎn)再打過(guò)來(lái)?

    過(guò)了 10 分鐘公子哥再次打電話詢問(wèn)

    公子哥 -> 女 A:怎么樣,有空嗎?[早晨 10 點(diǎn) 10 分]
    女 A -> 公子哥:我下午陪爸爸打馬球,不去了。
    公子哥 -> 女 B:怎么樣,有空嗎?[早晨 10 點(diǎn) 11 分]
    女 B -> 公子哥:好呀,下午 3 點(diǎn)來(lái)我家接我吧。
    公子哥 -> 女 B:好嘞,我開(kāi)車去接你。

    最終公子哥成功了追求到了女 B,這個(gè)故事告訴我們,成功的前提是有錢。(你怎么看?)

    名詞解釋

  • 公子哥用上了大哥大,可以實(shí)現(xiàn)雙向的通話,這就是 NIO 中的 Channel,可以實(shí)現(xiàn)雙向的數(shù)據(jù)流傳輸。

  • 公子哥不用像 BP 機(jī)小哥一樣死等著回復(fù),每次打電話都能得到回復(fù),掛斷電話一會(huì)兒再來(lái)詢問(wèn)即可,這就是 Channel 的非阻塞特性,也就是 “N” 的體現(xiàn)。

  • 公子哥可以同時(shí)撩兩個(gè)妹子,這就是 NIO 的 IO 多路復(fù)用,也就是 Selector。

  • 公子哥只能同時(shí)和一個(gè)人通話,這就是同步,所以 NIO 的全稱叫做同步非阻塞 IO。

  • 優(yōu)缺點(diǎn)

  • 非阻塞 IO 模型,不需要阻塞在特定的請(qǐng)求。

  • 一個(gè)線程可以處理多個(gè)請(qǐng)求,不需要客戶端和服務(wù)器端一比一的對(duì)應(yīng),沒(méi)有多線程創(chuàng)建和銷毀帶來(lái)的系統(tǒng)開(kāi)銷。

  • 服務(wù)端不需要死等請(qǐng)求,減少了服務(wù)端壓力。

  • 關(guān)鍵名詞

  • Channel,雙向傳輸,非阻塞的通道,有FileChannel,DatagramChannel,ServerSocketChannel/SocketChannel 等。

  • Buffer,數(shù)據(jù)塊的讀寫(xiě),可以理解字節(jié)數(shù)組,效率高。四個(gè)重要屬性:capacity 容量,position 位置, limit 上限,用戶切換讀寫(xiě)時(shí)候的游標(biāo),mark 標(biāo)記,標(biāo)記 position 的位置,分為堆內(nèi)內(nèi)存和堆外內(nèi)存,也是 NIO 性能的關(guān)鍵內(nèi)容。

  • Selector,IO 多路復(fù)用的關(guān)鍵,實(shí)現(xiàn)了循環(huán)查看可以使用的 Channel,解決死等問(wèn)題。

  • Selector 實(shí)現(xiàn)有多種方式,自己寫(xiě)一個(gè)數(shù)組循環(huán)也是方式,也可以實(shí)現(xiàn) IO 多路復(fù)用,只是性能好壞而已,所以基于底層 poll、select和epoll 也是實(shí)現(xiàn)“遍歷”可用通道的方式不同而已。select 使用輪詢的方式,有 1024 個(gè)連接的限制,poll 去掉了這個(gè)限制依然是輪詢的方式,epoll 是基于系統(tǒng)的注冊(cè)回調(diào)的方式,監(jiān)聽(tīng)系統(tǒng)的事件實(shí)現(xiàn)。

  • NIO 引入了 Buffer 的概念,每次使用 Buffer 拷貝數(shù)據(jù)其實(shí)是一次從用戶空間(JVM) 向系統(tǒng)空間(系統(tǒng)內(nèi)存) 的一次拷貝, Java 里面提供了 DirectByteBuffer 堆外內(nèi)存,如果使用使用堆外內(nèi)存,可以減少一次系統(tǒng)空間和用戶空間的拷貝,這種現(xiàn)象叫做零拷貝。強(qiáng)調(diào)一下,并不是操作系統(tǒng)不能直接操作 HeapByteBuffer(對(duì)內(nèi)內(nèi)存),而且在 GC 的作用下,內(nèi)存地址可能隨時(shí)變化,操作的內(nèi)存數(shù)據(jù)不一定準(zhǔn)備。

  • IO 多路復(fù)用性能更好,針對(duì)的 I/O 密集型應(yīng)用程序,如果是 CPU 密集型應(yīng)用程序,還是通過(guò)多線程的方案。所以很多寫(xiě) IO 多路復(fù)用的文章都會(huì)說(shuō)“多線程的創(chuàng)建,必然存在創(chuàng)建銷毀和切換的開(kāi)銷,在高并發(fā)系統(tǒng)中,會(huì)拖慢整個(gè)系統(tǒng)”,其實(shí)并不是非常的準(zhǔn)確,雖然是想說(shuō)明 I/O 多路復(fù)用的利好,但是確實(shí)有點(diǎn)以偏概全。

  • AIO:21 世紀(jì)非智能時(shí)代大學(xué)生把妹

    21 世紀(jì)初期,還沒(méi)有智能機(jī),不過(guò)諾基亞 1110 砸核桃神機(jī)已經(jīng)普及了,下面就是新時(shí)代大學(xué)生小王用自己的諾基亞 1110 的把妹過(guò)程。
    小王給中意的兩個(gè)女生直接發(fā)短信留言(群發(fā)):

    小王 -> 女 A:下午一起看個(gè)電影?[早晨 10 點(diǎn)]
    小王 -> 女 B:下午一起看個(gè)電影?[早晨 10 點(diǎn)]

    發(fā)完短信小王去看《西游記》去了。10分鐘以后電話響起,收到了妹子的短信,小王拿起了手機(jī)閱讀了消息并進(jìn)行回復(fù)。

    女 B -> 小王:好呀,下午 3 點(diǎn)來(lái)我家接我吧 [早晨 10 點(diǎn) 10 分]
    小王 -> 女 B:好的,我去接你不見(jiàn)不散。

    名詞解釋

  • 小王發(fā)完短信不需要盯著手機(jī)看,也不需要時(shí)不時(shí)看一下手機(jī),有短信回復(fù)會(huì)有通知,再來(lái)閱讀就好了。這就是 AIO 中的 AsynchronousServerSocketChannel,可以注冊(cè)一個(gè)回調(diào) CompletionHandler,等待有消息的時(shí)候直接通知回調(diào)處理即可。

  • 優(yōu)缺點(diǎn)

    AIO 包括了 NIO 的所有優(yōu)缺點(diǎn)的同時(shí),增加了異步回調(diào)的能力,由此解決的問(wèn)題是不需要同步的等待非阻塞 IO 的反饋,所以 NIO 叫做異步非阻塞 IO 模型。

    是時(shí)候展示真正的技術(shù)了

    說(shuō)了這么多,用 NIO 實(shí)現(xiàn)一個(gè)把妹聊天程序唄?

    服務(wù)器端

    public?class?NioServer?{public?void?start()?throws?IOException?{Selector?selector?=?Selector.open();ServerSocketChannel?serverSocketChannel?=?ServerSocketChannel.open();serverSocketChannel.bind(new?InetSocketAddress(6789));serverSocketChannel.configureBlocking(false);serverSocketChannel.register(selector,?SelectionKey.OP_ACCEPT);System.out.println("服務(wù)器啟動(dòng)成功");while?(true)?{selector.select();Set<SelectionKey>?selectionKeys?=?selector.selectedKeys();Iterator<SelectionKey>?iterator?=?selectionKeys.iterator();while?(iterator.hasNext())?{SelectionKey?selectionKey?=?iterator.next();if?(selectionKey.isAcceptable())?{iterator.remove();handleAccept(serverSocketChannel,?selector);}?else?if?(selectionKey.isReadable())?{handleRead(selectionKey);}?else?{System.out.println("其他請(qǐng)求");}}}}private?void?handleRead(SelectionKey?selectionKey)?throws?IOException?{SocketChannel?socketChannel?=?(SocketChannel)?selectionKey.channel();ByteBuffer?byteBuffer?=?ByteBuffer.allocate(1024);StringBuilder?request?=?new?StringBuilder();while?(socketChannel.read(byteBuffer)?>?0)?{byteBuffer.flip();request.append(StandardCharsets.UTF_8.decode(byteBuffer));}if?(request.length()?>?0)?{System.out.println("服務(wù)端收到消息:"?+?request.toString());}}private?void?handleAccept(ServerSocketChannel?serverSocketChannel,?Selector?selector)?throws?IOException?{SocketChannel?socketChannel?=?serverSocketChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(selector,?SelectionKey.OP_READ);System.out.println("有新人進(jìn)入聊天室");socketChannel.write(StandardCharsets.UTF_8.encode("進(jìn)入聊天室,現(xiàn)在可以聊天了"));}public?static?void?main(String[]?args)?throws?IOException?{new?NioServer().start();} }

    客戶端

    public?class?NioClient?{public?void?start()?throws?IOException?{SocketChannel?socketChannel?=?SocketChannel.open(new?InetSocketAddress(6789));Selector?selector?=?Selector.open();socketChannel.configureBlocking(false);socketChannel.register(selector,?SelectionKey.OP_READ);new?Thread(new?NioClientHandler(selector)).start();Scanner?scanner?=?new?Scanner(System.in);while?(scanner.hasNextLine())?{String?request?=?scanner.nextLine();if?(request?!=?null?&&?request.length()?>?0)?{socketChannel.write(StandardCharsets.UTF_8.encode(request));}}}public?static?void?main(String[]?args)?throws?IOException?{new?NioClient().start();}private?class?NioClientHandler?implements?Runnable?{private?Selector?selector;public?NioClientHandler(Selector?selector)?{this.selector?=?selector;}@Overridepublic?void?run()?{try?{while?(true)?{selector.select();Set<SelectionKey>?selectionKeys?=?selector.selectedKeys();Iterator?iterator?=?selectionKeys.iterator();while?(iterator.hasNext())?{SelectionKey?selectionKey?=?(SelectionKey)?iterator.next();SocketChannel?socketChannel?=?(SocketChannel)?selectionKey.channel();ByteBuffer?byteBuffer?=?ByteBuffer.allocate(1024);StringBuilder?response?=?new?StringBuilder();while?(socketChannel.read(byteBuffer)?>?0)?{byteBuffer.flip();response.append(StandardCharsets.UTF_8.decode(byteBuffer));}if?(response.length()?>?0)?{System.out.println("接收服務(wù)端消息:"?+?response);}}}}?catch?(Exception?e)?{e.printStackTrace();}}} }

    參考文檔

  • 圖解 | 深入揭秘 epoll 是如何實(shí)現(xiàn) IO 多路復(fù)用的!

  • 解鎖網(wǎng)絡(luò)編程之NIO的前世今生

  • NIO如何實(shí)現(xiàn)多路復(fù)用?

  • 深入理解 Java IO

  • 高并發(fā)專題之 IO 多路復(fù)用:Select、Poll、Epoll

  • 推薦文章
    • 面試官問(wèn):前后端分離項(xiàng)目,有什么優(yōu)缺點(diǎn)?我說(shuō):沒(méi)

    • 2020 年騰訊新增 20 億行代碼,鵝廠第一編程語(yǔ)言還是它

    • 通俗講解分布式鎖,看完不懂算我輸

    • 寫(xiě)博客能月入10K?

    • 一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問(wèn)答/社交網(wǎng)絡(luò)/博客)

    更多項(xiàng)目源碼
    • 這或許是最美的Vue+Element開(kāi)源后臺(tái)管理UI

    • 推薦一款高顏值的 Spring Boot 快速開(kāi)發(fā)框架

    • 一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問(wèn)答/社交網(wǎng)絡(luò)/博客)

    • 13K點(diǎn)贊都基于 Vue+Spring 前后端分離管理系統(tǒng)ELAdmin,大愛(ài)

    • 想接私活時(shí)薪再翻一倍,建議根據(jù)這幾個(gè)開(kāi)源的SpringBoot項(xiàng)目

    總結(jié)

    以上是生活随笔為你收集整理的第一次听人用男女关系讲 N(Non-Blocking)I(进)O(出),涨姿势了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。