如下內容摘自:敖丙肝了一個月的Netty知識點java
阻塞和非阻塞操做是針對發起的IO請求操做後是否馬上返回一個標誌信息而不讓請求線程等待,當數據準備未完成時,請求線程的狀態:服務器
阻塞:每每須要等待緩衝區中的數據準備好事後才處理其餘的事情,不然一直等待在那裏。網絡
非阻塞:不管數據是否準備好,都會直接返回。多線程
同步與異步是基於應用程序和操做系統處理IO事件所採用的方式:異步
同步:應用程序要直接參與IO讀寫的操做。性能
異步:全部的IO操做交給操做系統去處理,應用程序只須要等待通知。操作系統
異步相比較於同步帶來的直接好處就是在咱們處理IO數據的時候,異步的方式咱們能夠把這部分等待所消耗的資源用於處理其餘事務,提高咱們服務自身的性能。.net
NIO | BIO |
---|---|
基於緩衝區( Buffer ) | 基於流( Stream ) |
非阻塞 IO | 阻塞 IO |
選擇器( Selector ) | 無 |
Blocking IO,是同步阻塞的IO模型,傳統的IO【java.io包】就是這種模型。線程
BIO面向字節流或字符流,以流的方式順序地處理一個或多個字節。3d
BIO的IO操做是阻塞式的:當一個線程調用read()或write()時,該線程被阻塞,直到有一些數據被讀取,或數據徹底寫入。該線程在此期間不能再幹任何事情了。
採用BIO形式的網絡通訊,服務器端啓動一個ServerSocket,客戶端須要啓動Socket來進行一對一鏈接,若是客戶端有多個客戶端請求,當其中一個客戶端線程鏈接成功後,其餘的將會阻塞。若是須要實現服務端同時處理多個客戶端線程,必然須要服務器端開啓多線程與之對應,這樣就會致使若是客戶端請求過多,服務器線程開闢過多致使系統崩潰。
NIO是Java1.4引入的,相對於傳統的IO來講,N能夠表明New的意思,表示新IO,但更爲具體的理解是Non-blocking的意思,是一種同步非阻塞的IO模型。它提供了Buffer,Channel,Selector三大組件。
同步與非阻塞怎麼理解,是否矛盾?
非阻塞體如今:用戶程序發起IO操做請求後不等待數據,而是調用會當即返回一個標誌信息告知條件不知足,數據未準備好,用戶請求程序繼續執行其餘任務。執行完其餘任務,用戶程序會主動輪詢查看IO操做條件是否知足,若是知足,則用戶程序親自參與拷貝數據動做,這是同步的過程。
NIO支持面向Buffer,基於Channel的IO操做,任何數據在Buffer中進行處理,且可以任意改變操做位置,處理靈活。
NIO的IO操做能夠是非阻塞的:當一個線程執行從Channel讀取數據的IO操做時,若是有數據,則返回數據;若是沒數據,不須要阻塞,而是能夠直接返回。
NIO實現非阻塞IO的其中關鍵組件之一就是Selector,能夠註冊多個Channel到一個Selector中。Selector能夠不斷執行select操做,判斷這些註冊的Channel是否有已就緒的IO事件,如可讀,可寫,網絡鏈接已完成等。一個線程經過使用一個Selector管理多個Channel。
NIO就是一個線程負責全部請求鏈接但不處理IO操做,該線程只負責把鏈接註冊到多路複用器上,多用複用器輪詢到鏈接有IO請求時候再啓動其它線程處理IO請求操做,實現一個線程或少許線程就能夠對應衆多的客戶端線程。
JDK1.7中,java.nio.channels
包下增長了多個異步通道,是NIO的升級版本,實現AIO AsynchronousIO的異步非阻塞IO模型。
非阻塞前面已經解釋過了,異步指的就是數據拷貝階段徹底由操做系統處理,而應用程序只須要等待通知便可。