java網路程式設計_IO模型
阿新 • • 發佈:2018-11-02
理解java的BIO、NIO、AIO的原理:
一、UNIX程式設計中的五種IO模型:
1. 阻塞IO 外賣小哥去商家取外賣,到了麻辣燙店,商家還沒做好, 外賣小哥雖然還有其他單子要送,但是不得不焦急地等著商家; 2. 非阻塞IO 外賣小哥去商家取外賣,到了麻辣燙店,商家還沒做好, 外賣小哥出去休息會兒後來看還是沒做好,又出去休息會兒後再看還是沒好, 商家看到小哥很著急,加速打包,等小哥再來時,終於成功取餐; 3. 多路複用IO 外賣小哥去商家取外賣,突然想到上次到麻辣燙店等了很久, 於是打電話給商家:“做好了給回個電話好嗎“”,商家:“好的”; 不一會兒商家做好了打電話給外賣小哥,外賣小哥過來後直接取餐不用再等那麼久了; 4. 訊號驅動IO 外賣小哥去商家取外賣,不想每次打電話浪費話費了, 商家過會做好了,也通知平臺餐已做好; 平臺收到後立即通知外賣小哥,小哥隨即出發取到了麻辣燙; 5. 非同步IO 外賣小哥去商家取外賣,突然被老闆叫去訓話,但是剛接的單不能耽擱了, 於是讓同事幫忙取一下,自己訓完話就去送;同事小美等餐好了後,取回來告訴了外賣小哥:“我幫你取回來了”’; 小哥正好訓完話,一番感謝後,隨即出發送餐去了;
非同步與同步的區別:
單個程序與多個程序;(外賣小哥自己等與找人代勞)
阻塞與非阻塞的區別:
單執行緒等待與多執行緒併發;(外賣小哥在商家等與餐好了再去)
二、java網路程式設計IO模型
1. BIO原理
同步並阻塞,伺服器實現模式為一個連線一個執行緒,
如果這個連線不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善。
缺點:客戶端增多,新建執行緒增多,效能下降,甚至死掉;
2. NIO原理
同步非阻塞,伺服器實現模式為一個請求一個執行緒, 即客戶端傳送的連線請求都會註冊到多路複用器Selector上, 多路複用器輪詢到連線有I/O請求時才啟動一個執行緒進行處理。(基於Reactor)
1 服務端:開啟ServerSocketChannel,設定連線為非阻塞模式,繫結埠,
開啟通道管理器Selector,並把channel註冊到Selector上,selector迴圈監聽客戶端連線;
2 客戶端:開啟SocketChannel,設定連線為非阻塞模式,繫結IP和埠,
開啟通道管理器Selector,並把channel註冊到Selector上,selector迴圈監聽服務端連線;
3 服務端:selector監聽到連線請求,完成連線,可以write發訊息到客戶端;
註冊讀監聽,可以監聽下次客戶端發來的訊息;
4 客戶端:selector監聽到連線請求,完成連線,可以write 發訊息到服務端;
註冊讀監聽,可以監聽下次服務端發來的訊息;
3. AIO原理
非同步非阻塞,伺服器實現模式為一個有效請求一個執行緒,
與NIO的區別是:客戶端的I/O請求都是由作業系統先完成了再通知伺服器應用去啟動執行緒進行處理;