摘要:為了講清復(fù)用的是什么,首先得先說(shuō)明一下邏輯流的概念。理解了這個(gè),那么所謂的復(fù)用,指的就是在一個(gè)邏輯流里處理多個(gè)事件如何做到利用多路復(fù)用器,輪詢監(jiān)聽(tīng)各路,如果一旦有事件發(fā)生,那么就去處理,否則程序阻塞。
java nio提供了一套稱為I/O多路復(fù)用的編程范式,那么什么叫做I/O多路復(fù)用呢?
所謂的I/O多路復(fù)用,從字面意思上來(lái)理解,就是:
有多個(gè)I/O操作(或是寫(xiě),或是讀,或是請(qǐng)求),這多個(gè)I/O操作都共用一個(gè)邏輯流。
為了講清復(fù)用的是什么,首先得先說(shuō)明一下邏輯流的概念。
邏輯流是什么?這里的邏輯流和操作系統(tǒng)中"線程是進(jìn)程的一個(gè)邏輯流"是一個(gè)意思。
下面的就是一個(gè)邏輯流:
{ int a = 5; int b a*a; double c = a/b; }
下面又是一個(gè)邏輯流:
{ long b = 5; int c = b+3; }
如果在一個(gè)進(jìn)程中,如果沒(méi)有線程,那么程序是順序執(zhí)行的,那么所有的代碼都是屬于一個(gè)邏輯流。
比如說(shuō),上面的兩端代碼,如果合在一個(gè)進(jìn)程當(dāng)中,它們一定是這種結(jié)構(gòu):
{ int a = 5; int b a*a; double c = a/b; } .... { long b = 5; int c = b+3; }
或是
{ long b = 5; int c = b+3; } .... { int a = 5; int b a*a; double c = a/b; }
也就是說(shuō)它們一定屬于一個(gè)邏輯流(一個(gè)順序結(jié)構(gòu))。
理解了這個(gè),那么所謂的I/O復(fù)用,指的就是在一個(gè)邏輯流里處理多個(gè)I/O事件!!!
如何做到?利用Selector多路復(fù)用器,輪詢監(jiān)聽(tīng)各路I/O,如果一旦有I/O事件發(fā)生,那么就去處理,否則程序阻塞。
來(lái)看一個(gè)程序,加深理解:
package qiuqi.filedownloadtest; import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.*; import java.util.Iterator; public class FileServer { public static void main(String[] args) throws IOException { startServer(); } public static void startServer() throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(9999)); serverSocketChannel.configureBlocking(false); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (selector.select() > 0) { Iteratoriterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); iterator.remove(); if(key.isAcceptable()) { System.out.println("收到連接這個(gè)I/O事件"); catch (IOException e){e.printStackTrace();} } } } } }
這是一個(gè)監(jiān)聽(tīng)網(wǎng)絡(luò)I/O的多路復(fù)用程序,java中只能監(jiān)聽(tīng)網(wǎng)絡(luò)I/O,不能監(jiān)聽(tīng)標(biāo)準(zhǔn)輸入輸出等I/O(不過(guò)這些在linux里都可以)。
我們發(fā)現(xiàn),這個(gè)程序的原理就是開(kāi)啟一個(gè)網(wǎng)絡(luò)I/O類(lèi),ServerSocketChannel,把它注冊(cè)到Selector(選擇器)上,然后選擇器就開(kāi)始
輪詢,直到發(fā)現(xiàn)一個(gè)I/O事件,于是就進(jìn)入第一個(gè)while循環(huán)進(jìn)行處理,否則一直阻塞在select()>0處。
這是一個(gè)極其簡(jiǎn)陋的程序,但是它揭示了多路復(fù)用的真正內(nèi)涵,也就是用一個(gè)邏輯流監(jiān)聽(tīng),處理多個(gè)I/O(不過(guò)處理程序其實(shí)可以開(kāi)啟多線程,也就是指第一個(gè)while循環(huán)里的部分)。
這就是I/O多路復(fù)用!!!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73557.html
摘要:為解決這問(wèn)題,我們發(fā)現(xiàn)元兇處在一線程一請(qǐng)求上,如果一個(gè)線程能同時(shí)處理多個(gè)請(qǐng)求,那么在高并發(fā)下性能上會(huì)大大改善。這樣一個(gè)線程可以同時(shí)發(fā)起多個(gè)調(diào)用,并且不需要同步等待數(shù)據(jù)就緒。表示當(dāng)前就緒的事件類(lèi)型。 JAVA NIO 一步步構(gòu)建I/O多路復(fù)用的請(qǐng)求模型 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog 文章一:JAVA ...
摘要:事件多路復(fù)用器收集資源的事件并且把這些事件放入隊(duì)列中,直到事件被處理時(shí)都是阻塞狀態(tài)。最后,處理事件多路復(fù)用器返回的每個(gè)事件,此時(shí),與系統(tǒng)資源相關(guān)聯(lián)的事件將被讀并且在整個(gè)操作中都是非阻塞的。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書(shū)筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關(guān)注我的專欄,之后的博文將在專欄同步:...
Java IO對(duì)大多數(shù)Java程序員來(lái)說(shuō)是熟悉又陌生,熟悉的是感覺(jué)到處都有它的身影,小到簡(jiǎn)單的讀取文件,大到各種服務(wù)器的應(yīng)用,陌生的是Java IO背后到底是一個(gè)怎樣的機(jī)制,今天就讓我們?nèi)チ私庖幌逻@位老朋友吧。本文不講解Java IO如何具體使用,有這方面需求的同學(xué)可以自己查下。 IO模型 要說(shuō)IO,就不得不說(shuō)IO模型,IO模型大家都有所了解,同步異步,阻塞非阻塞什么的,總的來(lái)說(shuō)IO模型可分為以下...
閱讀 2623·2023-04-26 00:07
閱讀 2432·2021-11-15 11:37
閱讀 639·2021-10-19 11:44
閱讀 2164·2021-09-22 15:56
閱讀 1717·2021-09-10 10:50
閱讀 1497·2021-08-18 10:21
閱讀 2565·2019-08-30 15:53
閱讀 1630·2019-08-30 11:11