国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

xiaowugui666 / 2111人閱讀

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

什么是NIO?

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

channel是什么?

類比流的概念。與流的區別在于

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

chanel可以異步的讀和寫

數據總是從channel中讀到buffer,或者從buffer中寫到channel

流的讀取或寫一般是一次性的操作,數據在讀取過程中不會有緩存,這也就意味著沒有辦法自己隨便移動到想要讀取的位置,要實現這個功能也就只能先緩存
java中的channel有哪些?

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

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

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

SocketChannel:它是一個已經建立連接的TCP網絡socket,用來處理TCP協議連接,通過SocketChannel.open()再調用自身的connet即可建立

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

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

用來方便操作內存塊中數據的一個包裝類。它有3個屬性

capacity:表示Buffer能容納的數據量,滿了就不能再寫

position:讀或者寫開始的位置

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

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

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

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

怎么讀取數據到多個Buffer?

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

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

用來監控多個channel的事件,比如channel的連接建立、數據到達等等

實際上可以只用一個線程來管理所有的channel
selector使用示例
//創建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 得到的結果即是否為ACCEPT事件
//通過這種方式即實現了注冊,表明當前channel需要監聽的是 read 事件,如果對多個事件感興趣,那么可以使用 SelectionKey.OP_READ | SelectionKey.OP_WRITE 方式實現
//注冊方法還可以添加另一個參數,attach,用來附加更多的信息給channel,比如將Buffer給channel
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
  //select()對channel注冊的事件如果一個都沒有好,那么阻塞住,返回值表示事件已經發生的chanel的個數;
  //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()) {
      //和遠程已經建立了連接
    } else if (key.isReadable()) {
      //channel可讀
    } else if (key.isWritable()) {
      //channel可寫
    }
    //必須手動執行
    keyIterator.remove();
  }
}
wakeup:如果channel當前剛好阻塞在select,會立馬返回

java NIO 參考

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71538.html

相關文章

  • JDK10都發布了,nio你了解多少?

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

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

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

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

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

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

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

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

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

    Coding01 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<