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

資訊專欄INFORMATION COLUMN

java nio中的select和channel是怎么使用的?

xiaowugui666 / 2161人閱讀

摘要:什么是線程在處理數(shù)據(jù)時,如果線程還處于將數(shù)據(jù)從讀到的這段時間內(nèi),線程可以去做別的事情,等數(shù)據(jù)都讀到了,線程再回來處理讀到的數(shù)據(jù)是什么類比流的概念。

什么是NIO?

線程在處理數(shù)據(jù)時,如果線程還處于將數(shù)據(jù)從channel讀到buffer的這段時間內(nèi),線程可以去做別的事情,等數(shù)據(jù)都讀到buffer了,線程再回來處理讀到的數(shù)據(jù)

channel是什么?

類比流的概念。與流的區(qū)別在于

channel是可讀可寫的,但是一個流要么寫要么讀

chanel可以異步的讀和寫

數(shù)據(jù)總是從channel中讀到buffer,或者從buffer中寫到channel

流的讀取或?qū)懸话闶且淮涡缘牟僮?,?shù)據(jù)在讀取過程中不會有緩存,這也就意味著沒有辦法自己隨便移動到想要讀取的位置,要實現(xiàn)這個功能也就只能先緩存
java中的channel有哪些?

FileChannel:連接文件的channel,通過文件對象的getChannel方法即可獲取

FileChannel的write()方法不保證一次會寫到channel中的字節(jié)數(shù);另外它不能被設置為非阻塞,永遠只能設置成阻塞模式

DatagramChannel:處理UDP協(xié)議連接,通過DatagramChannel.open()然后再獲取socket執(zhí)行綁定即可端口

SocketChannel:它是一個已經(jīng)建立連接的TCP網(wǎng)絡socket,用來處理TCP協(xié)議連接,通過SocketChannel.open()再調(diào)用自身的connet即可建立

ServerSocketChannel:用來監(jiān)聽TCP連接的建立,通過ServerSocketChannel.open()可以建立,隨后就可以綁定需要監(jiān)聽的端口,并等待連接的到來,每個已建立的連接都會返回一個SocketChannel

非阻塞模式下,等待連接到來的accept方法會立馬返回,注意判斷SocketChannel是不是null;另外可能有多個連接建立,所以監(jiān)聽一般會放在一個while循環(huán)里面
Buffer是什么?

用來方便操作內(nèi)存塊中數(shù)據(jù)的一個包裝類。它有3個屬性

capacity:表示Buffer能容納的數(shù)據(jù)量,滿了就不能再寫

position:讀或者寫開始的位置

limit:寫模式下表示能往buffer中寫的數(shù)據(jù)量,最大值是capacity;讀模式下表示能從buffer中獲取的數(shù)據(jù)量,之前buffer中寫了多少,就能讀多少

從寫模式轉(zhuǎn)換到讀模式需要用flip()完成,調(diào)用完成之后,limit會被設置成position當時的值,而positon會被設置成0;

讀取數(shù)據(jù)完畢轉(zhuǎn)換成寫需要調(diào)用clear或者compact方法,其中clear會置position為0,limit為capacity,compact則會把原有的數(shù)據(jù)拷貝到開始的位置,然后其后的位置設置為position,limit則是capacity

mark和reset用法:在執(zhí)行讀取的時候,先mark住當前的位置,執(zhí)行讀取完成之后reset就回到原讀取數(shù)據(jù)之前的位置了

怎么讀取數(shù)據(jù)到多個Buffer?

創(chuàng)建一個數(shù)組用來放要寫的數(shù)據(jù),或者將要讀到的數(shù)據(jù),再執(zhí)行讀寫操作即可,但是這種方式不適合讀取變長消息

Buffer[] bArr = {head,body};
channel.read(bArr); //讀 ,如果head本身會放自身容量的數(shù)據(jù)然后再往body中塞
Buffer[] wArr={head,body}
channel.write(wArr);//寫
Selector是干啥的?

用來監(jiān)控多個channel的事件,比如channel的連接建立、數(shù)據(jù)到達等等

實際上可以只用一個線程來管理所有的channel
selector使用示例
//創(chuàng)建selector
Selector selector = Selector.open();
//使用Selector必須設置為false,同時意味著FileChannel是不能用Selector
channel.configureBlocking(false);
// SelectionKey一共有4種值,分別代表4個事件:connect、accept、read、write
// 通過方法 interestOps 可以得到注冊時對channel感興趣的事件,具體獲取方式為 interestSet & SelectionKey.OP_ACCEPT 得到的結(jié)果即是否為ACCEPT事件
//通過這種方式即實現(xiàn)了注冊,表明當前channel需要監(jiān)聽的是 read 事件,如果對多個事件感興趣,那么可以使用 SelectionKey.OP_READ | SelectionKey.OP_WRITE 方式實現(xiàn)
//注冊方法還可以添加另一個參數(shù),attach,用來附加更多的信息給channel,比如將Buffer給channel
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
  //select()對channel注冊的事件如果一個都沒有好,那么阻塞住,返回值表示事件已經(jīng)發(fā)生的chanel的個數(shù);
  //selectNow()則不阻塞,沒有準備好就返回0
  int readyChannels = selector.select();
  if(readyChannels == 0) continue;
  //用來獲取準備好的channel
  Set selectedKeys = selector.selectedKeys();
  Iterator keyIterator = selectedKeys.iterator();
  while(keyIterator.hasNext()) {
    SelectionKey key = keyIterator.next();
    if(key.isAcceptable()) {
      //SeverSocketChannel接受了一個新的連接
    } else if (key.isConnectable()) {
      //和遠程已經(jīng)建立了連接
    } else if (key.isReadable()) {
      //channel可讀
    } else if (key.isWritable()) {
      //channel可寫
    }
    //必須手動執(zhí)行
    keyIterator.remove();
  }
}
wakeup:如果channel當前剛好阻塞在select,會立馬返回

java NIO 參考

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

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

相關(guān)文章

  • JDK10都發(fā)布了,nio你了解多少?

    摘要:而我們現(xiàn)在都已經(jīng)發(fā)布了,的都不知道,這有點說不過去了。而對一個的讀寫也會有響應的描述符,稱為文件描述符,描述符就是一個數(shù)字,指向內(nèi)核中的一個結(jié)構(gòu)體文件路徑,數(shù)據(jù)區(qū)等一些屬性。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 本來我預想是先來回顧一下傳統(tǒng)的IO模式的,將傳統(tǒng)的IO模式的相關(guān)類理清楚(因為IO的類很多)。 但是,發(fā)現(xiàn)在整理的過程已...

    YFan 評論0 收藏0
  • Java NIO詳解

    摘要:前言本篇主要講解中的機制和網(wǎng)絡通訊中處理高并發(fā)的分為兩塊第一塊講解多線程下的機制第二塊講解如何在機制下優(yōu)化資源的浪費服務器單線程下的機制就不用我介紹了,不懂得可以去查閱下資料那么多線程下,如果進行套接字的使用呢我們使用最簡單的服務器來幫助大 前言 本篇主要講解Java中的IO機制和網(wǎng)絡通訊中處理高并發(fā)的NIO 分為兩塊:第一塊講解多線程下的IO機制第二塊講解如何在IO機制下優(yōu)化CPU資...

    rickchen 評論0 收藏0
  • 【自己讀源碼】Netty4.X系列(三) Channel Register

    摘要:我想這很好的解釋了中,僅僅一個都這么復雜,在單線程或者說串行的程序中,編程往往是很簡單的,說白了就是調(diào)用,調(diào)用,調(diào)用然后返回。 Netty源碼分析(三) 前提概要 這次停更很久了,原因是中途迷茫了一段時間,不過最近調(diào)整過來了。不過有點要說下,前幾天和業(yè)內(nèi)某個大佬聊天,收獲很多,所以這篇博文和之前也會不太一樣,我們會先從如果是我自己去實現(xiàn)這個功能需要怎么做開始,然后去看netty源碼,與...

    darkbug 評論0 收藏0
  • Java NIO淺析

    摘要:阻塞請求結(jié)果返回之前,當前線程被掛起。也就是說在異步中,不會對用戶線程產(chǎn)生任何阻塞。當前線程在拿到此次請求結(jié)果的過程中,可以做其它事情。事實上,可以只用一個線程處理所有的通道。 準備知識 同步、異步、阻塞、非阻塞 同步和異步說的是服務端消息的通知機制,阻塞和非阻塞說的是客戶端線程的狀態(tài)。已客戶端一次網(wǎng)絡請求為例做簡單說明: 同步同步是指一次請求沒有得到結(jié)果之前就不返回。 異步請求不會...

    yeooo 評論0 收藏0
  • 一文理解:Java NIO 核心組件

    摘要:的出現(xiàn)解決了這尷尬的問題,非阻塞模式下,通過,我們的線程只為已就緒的通道工作,不用盲目的重試了。注意要將注冊到,首先需要將設置為非阻塞模式,否則會拋異常。 showImg(https://segmentfault.com/img/remote/1460000017053374); 背景知識 同步、異步、阻塞、非阻塞 首先,這幾個概念非常容易搞混淆,但NIO中又有涉及,所以總結(jié)一下。 ...

    Coding01 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<