国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

IO和NIO

2018-05-03 22:18 更新

1.什么是阻塞和非阻塞?什么是同步和異步?

阻塞和非阻塞:

從線程的角度考慮 ,線程掛起 不在搶奪CPU 則稱為線程被阻塞 同步和異步:

任務的執(zhí)行需要相互等待、相互協(xié)調為同步;各執(zhí)行各的,不管其他人,是異步。

2.解釋一下什么是NIO?

是jdk1.4出現同步非阻塞式IO,它可以實現面向通道操作緩沖區(qū),雙向的傳遞數據,它適合在高并發(fā)的情況下使用,可以實現少量的線程為多個客戶端服務。

3.NIO和IO有什么區(qū)別?

1) BIO: 面向流,操作字節(jié)字符,具有方向性,同步阻塞式IO 比喻:水管 InputStream OutputStream Reader Writer

         

2)NIO: 面向通道,操作緩沖區(qū),可以雙向傳輸數據,同步非阻塞式IO 比喻:地下通道 Channel Buffer Selector

4.NIO的常用API?

要實現NIO,主要就是操作它的三個API;

1)Channel 通道 可以實現雙向傳輸數據

既能讀,又能寫,在使用的時候需要調用方法將其設置為false,即非阻塞模式;它有很多的實現類:

2)Buffer 緩沖區(qū)

在內存中開辟一段連續(xù)的空間,用于存儲臨時的數據。

常用的ByteBuffer,和CharBuffer,還有其它的用于不同的數據類型

所有的buffer都是抽象類,無法被直接實例化;

緩沖區(qū)的數據存放在內存中,能提高讀寫效率;

緩沖區(qū)有指針記錄,能改變讀寫數據的起始點,處理靈活;

Buffer有幾個基本的屬性:capacity、Position、Limit、Mark

  • Int Capacity()容量,緩沖區(qū)支持的最大容量
  • Int Position()記錄指針,緩沖區(qū)讀寫數據的起始點。開始為0,最大為limit
  • Int Limit()界限,讀寫數據的終止點
  • Mark標記,在0-positon,設置該值

緩沖區(qū)常用的方法:清除/反轉/環(huán)繞/存放/取/存

  • Clear()清空緩沖區(qū),僅僅是移動position和limit,在往里寫會覆蓋原有的數據
  • flip()實現反轉緩沖區(qū),確定緩存區(qū)的數據的起點和終止點
  • Rewind() 重繞緩沖區(qū),就是重新讀一遍
  • hasRemaining()判斷positon和limit之間是否有元素
  • Mark() 標記一個mark,隨時可以回到這個標記
  • Wrap()創(chuàng)建緩沖區(qū)
  • Get()和put()獲取元素和存放元素

3)Selector 選擇器

多個客戶端在Selector中注冊自己,多個通道注冊到Selector中,通過選擇操作選出就緒的鍵,通道線程來實現少量線程的為多個客戶端服務

用到的一些方法:

  • register()方法;將通道注冊到選擇器中,
  • Selector.open();獲取選擇器
  • int select();選擇器進行選擇操作
  • Set<SelectionKey> selectedKeys();獲取已經就緒的鍵

5.什么是網絡數據傳輸的粘包問題?

數據包之間發(fā)生的粘連問題,網絡分為7層,每層負責每層的任務, TCP不理解應用層傳輸過來的數據

由于TCP傳輸是一種可靠的連續(xù)的數據傳輸,如果兩次傳輸的數據時間間隔比較短,數據的接收方可能很難判斷出兩次數據的邊界在哪里,感覺就好像兩個數據黏著在了一次,無法區(qū)分。

粘包問題常用的解決辦法:
1)每次傳輸固定大小的數據,存在資源浪費,缺乏靈活性
2)約定分隔符,如果符號相同,轉義一下,需要解析,不是很好
3)使用協(xié)議,雙方約定好
使用公開協(xié)議,或者私有的協(xié)議
在傳輸的過程中,先傳遞長度信息,在根據長度信息獲取數據

6.IO圖1

7.IO圖2

推薦一篇好文章https://www.cnblogs.com/xiaoxi/p/6576588.html

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號