NIO同步阻塞與同步非阻塞

2021-09-11 10:44:22 字數 1615 閱讀 9974

io與nio區別:其本質就是阻塞和非阻塞的區別。

阻塞概念:應用程式在獲取網路資料的時候,如果網路傳輸資料很慢,就會一直等待,直到傳輸完畢為止。

非阻塞概念:應用程式直接可以獲取已經準備就緒好的資料,無需等待。

io為同步阻塞形式,nio為同步非阻塞形式,nio並沒有實現非同步,在jdk1.7公升級nio庫包,支援非同步非阻塞。

bio:同步阻塞式io,伺服器實現模式為乙個連線乙個執行緒,即客戶端有連線請求時伺服器端就需要啟動乙個執行緒進行處理,如果這個鏈結不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善。

nio:同步非阻塞式io,伺服器實現模式為乙個請求乙個執行緒,即客戶端傳送的鏈結請求都會註冊到選擇器上,選擇器輪詢到連線有io請求時才啟動乙個執行緒進行處理。

aio:非同步非阻塞式io,伺服器實現模式為乙個有效請求乙個執行緒,客戶端的io請求都是由os先完成在通知伺服器應用去啟動執行緒進行處理。

同步時,應用程式會直接參與io讀寫操作,並且我們的應用程式會直接阻塞到某乙個方法上,直到資料準備就緒,或者採用輪訓的策略實時檢查資料的就緒狀態,如果就緒則獲取資料。

非同步時,則所有的io讀寫操作交給作業系統,與我們的應用程式沒有直接關係,我們程式不需要關係io讀寫,當作業系統完成了io讀寫操作時,會給我們應用程式傳送通知,我們的應用程式直接拿走資料即可。

偽非同步

由於bio乙個客戶端需要乙個執行緒去處理,因此我們進行優化,後端使用執行緒池來處理多個客戶端的請求接入,形成客戶端個數m,執行緒池最大的執行緒數n的比例關係,其中m可以遠遠大於n,通過執行緒池可以靈活的調配執行緒資源,設定執行緒的最大值,防止由於海量併發接入導致執行緒耗盡。

//伺服器端

public class tcpserver catch (exception e)

}});

}} catch (exception e) finally }}

//客戶端

public class tcpclient

}

什麼是阻塞

應用程式在獲取網路資料的時候,如果網路傳輸很慢,那麼程式就一直等著,直接到傳輸完畢。

什麼是非阻塞

應用程式直接可以獲取已經準備好的資料,無需等待。

io為同步阻塞形式,nio為同步非阻塞形式,nio沒有實現非同步,在jdk1.7之後,公升級nio庫包,支援非同步非阻塞通訊模型。

//非同步非阻塞

public class client

sc.close(); }}

public class server else if(sk.isreadable()) }}

it.remove();

} }}

選擇key

selectionkey.op_connect     可連線

selectionkey.op_accpt           可接受連線

selectionkey.op_read             可讀

selectionkey.op_write           可寫

如果要監聽多種事件,可以用 | 操作符將常量連線起來。

NIO基礎之同步 非同步 阻塞 非阻塞

這裡區分幾個概念,也是常見但是容易混淆的概念,就是標題中的同步 非同步 阻塞 非阻塞。同步與非同步,關心的是訊息通訊的機制。也就是呼叫者和被呼叫者之間,訊息是如何進行通知的。如果是呼叫者主動等待呼叫的結果,那麼就是同步。如果是被呼叫者主動去通知呼叫者,就是非同步。從上面的描述中,我們可以看到。同步還...

阻塞非阻塞與同步非同步

老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...

同步 非同步與阻塞 非阻塞

怎樣理解阻塞非阻塞與同步非同步的區別?嚴肅的回答 知乎 知乎這個問題下的各個回答,以及這篇blog已經講的很清楚了。也有提到同步阻塞,和非同步非阻塞是繫結的。但也有對同步非阻塞,和非同步非阻塞的模型的闡釋,特此記錄解釋。在這套解釋中,同步和非同步的語義不只是立即返回與否,還是獲取結果已完成的方式是通...