日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在2011年7月28日,jdk1.7被正式發(fā)布。他的一個(gè)最大的亮點(diǎn)就是將原來的NIO類庫生成到了NIO2.0,也被叫做AIO。這篇文章將通過案例對AIO進(jìn)行一個(gè)講解。

一、IO的演進(jìn)

在jdk1.4之前,JAVA中的IO類庫實(shí)在是超級原始,很多我們現(xiàn)在熟知的概念都還沒有出現(xiàn),比如說管道、緩沖區(qū)等等。正是由于這些等等原因,C語言和C++一直都是IO方面的首選。這是原始的IO方式,也叫作BIO,它的原理很簡單,我們使用一張圖來表示一下:

聊聊java中NIO的2.0版本AIO

 

也就是說BIO時(shí)代,每次有一個(gè)客戶端連接進(jìn)來的時(shí)候,都會有一個(gè)新的線程去處理,缺點(diǎn)顯而易見,如果連接比較多的時(shí)候,我們就要建立大量的線程去一一處理。

幾年之后,2002年,jdk1.4開始被正式發(fā)布了,做出的一個(gè)巨大的改變就是新增了NIO包。它提供了很多異步的IO操作方法,比如說緩沖區(qū)ByteBuffer、Pipe、Channel還有多路復(fù)用器Selector等等。新的NIO類庫的出現(xiàn),極大地促進(jìn)了java對異步非阻塞式編程的發(fā)展。NIO的原理也是很簡單。在這里同樣使用一張圖來演示一遍:

聊聊java中NIO的2.0版本AIO

 

現(xiàn)在我們可以看到,所有的客戶端連接都可以只用一個(gè)線程就可以實(shí)現(xiàn)了。

不過時(shí)代總是在一點(diǎn)一點(diǎn)的變化,逐漸的java官方為我們提供的NIO類庫越來越不能滿足需求,比如說不支持異步文件讀寫操作、沒有統(tǒng)一的文件屬性等等。于是過了幾年,在2011年7月28日,官方將用了將近十年的NIO類庫做了升級,也被稱為NIO2.0。后來也叫作AIO。AIO的原理是在之前的基礎(chǔ)上進(jìn)行的改進(jìn),意思是異步非阻塞式IO,也就是說你的客戶端在進(jìn)行讀寫操作的時(shí)候,只需要給服務(wù)器發(fā)送一個(gè)請求,不用一直等待回答就可以去做其他的事了。

下面我們使用代碼敲一遍來看看如何實(shí)現(xiàn)AIO。

二、AIO的實(shí)現(xiàn)

這個(gè)案例很簡單,就是服務(wù)端和客戶端一個(gè)簡單的通信。我們先把代碼寫好,然后再去分析代碼的含義。

1、服務(wù)端

第一步:定義Server啟動(dòng)類

聊聊java中NIO的2.0版本AIO

 

 

在這里我們定義了一個(gè)AIOServerHandle線程去處理服務(wù)器端的邏輯,在這里我們還休眠了很長時(shí)間,這是為了避免沒有客戶端連接時(shí),程序運(yùn)行結(jié)束。現(xiàn)在我們最主要的就是AioServerHandle的代碼邏輯了。

第二步:AioServerHandle類實(shí)現(xiàn)

 

聊聊java中NIO的2.0版本AIO

 

 

 

我們分析一下這段代碼,首先我們定義了一個(gè)AsynchronousServerSocketChannel,他表示的就是異步的ServerSocketChannel。然后我們在構(gòu)造方法中打開鏈接,綁定地址和端口。最后再run方法中new了一個(gè)AcceptCompleteHandler來處理接入的客戶端。現(xiàn)在就像踢皮球一樣,真正的處理邏輯又給了新的類AcceptCompleteHandler,我們再來看。

第三步:AcceptCompleteHandler的實(shí)現(xiàn)

 

聊聊java中NIO的2.0版本AIO

 

 

聊聊java中NIO的2.0版本AIO

 

 

聊聊java中NIO的2.0版本AIO

 

第一部分:

通過構(gòu)造方法來接受傳遞過來的AsynchronousServerSocketChannel。

第二部分第一小節(jié):

serverSocketChannel繼續(xù)接受傳遞過來的客戶端,為什么呢?因?yàn)檎{(diào)用了AsynchronousServerSocketChannel的accept方法之后,如果有新的客戶端連接進(jìn)來,系統(tǒng)會回調(diào)我們的CompletionHandler得completed方法。但是一個(gè)AsynchronousServerSocketChannel往往能接受成千上萬個(gè)客戶端,所以在這里繼續(xù)調(diào)用了Accept方法。以便于接受其他客戶端的鏈接。

第二部分第二小節(jié):

channel.read方法讀取客戶端傳遞過來的數(shù)據(jù),而且在內(nèi)部還有一個(gè)channel.write方法,表示返回給客戶端的信息。代碼邏輯是一樣的。

第二部分第三小節(jié):

在這里表示讀取信息失敗,內(nèi)部也有一個(gè)failed方法表示的就是寫入信息失敗。

第三部分:

這也是一個(gè)failed方法,表示的是鏈接客戶端失敗。

到這里我們會看到,AIO的代碼邏輯很復(fù)雜,在這里只是實(shí)現(xiàn)一個(gè)最簡單的通信例子就這么麻煩,稍微增加點(diǎn)功能代碼邏輯會讓我們發(fā)瘋。不過為了保持代碼的完整性,我們還是要給出客戶端的實(shí)現(xiàn)。

2、客戶端

客戶端的實(shí)現(xiàn)就比較簡單了。

第一步:創(chuàng)建客戶端入口類

聊聊java中NIO的2.0版本AIO

 

在這里我們同樣使用一個(gè)AioClientHandle來處理客戶端的代碼邏輯,現(xiàn)在我們繼續(xù)看代碼。

第二步:AioClientHandle類實(shí)現(xiàn):

聊聊java中NIO的2.0版本AIO

 

 

聊聊java中NIO的2.0版本AIO

 

 

聊聊java中NIO的2.0版本AIO

 

 

聊聊java中NIO的2.0版本AIO

 

?這個(gè)代碼邏輯和服務(wù)端的差不多,在這里就不說了。下面我們主要分析一下為什么不用AIO。

三、AIO的缺點(diǎn)

上面BB了這么久就是為了說明為什么不使用他,你千萬別急,因?yàn)橹褐瞬拍馨賾?zhàn)不殆。你只有理解了AIO才能知道工作中應(yīng)該用什么,

1、實(shí)現(xiàn)復(fù)雜

上面的代碼量你已經(jīng)看到了,惡心到不能惡心。實(shí)現(xiàn)這么一個(gè)簡單的功能就要寫這么多。

2、需要額外的技能

也就是說你想要學(xué)號AIO,還需要java多線程的技術(shù)做鋪墊才可以。否則我們很難寫出質(zhì)量高的代碼。

3、一個(gè)著名的Selector空輪詢bug

它會導(dǎo)致CPU100%,之前在我的群里面,有人曾經(jīng)遇到過這個(gè)問題,而且官方說在1.6的版本中解決,但是現(xiàn)在還有。遇到的時(shí)候我們雖然可以解決但是不知道的人會很痛苦。

4、可靠性差

也就是說我們的網(wǎng)絡(luò)狀態(tài)是復(fù)雜多樣的,會遇到各種各樣的問題,比如說網(wǎng)斷重連、緩存失效、半包讀寫等等。可靠性比較差。稍微出現(xiàn)一個(gè)問題,還需要大量的代碼去完善。

當(dāng)然還有很多其他的缺點(diǎn),不過就單單第一條估計(jì)就很難發(fā)展。后來出現(xiàn)了更加牛的網(wǎng)絡(luò)通信框架netty。很好的解決了上面的問題,也是目前最主流的框架。更多內(nèi)容,在后續(xù)文章中推出。今天的文章先到這,感謝支持。

分享到:
標(biāo)簽:java NIO
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定