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已經講的很清楚了。也有提到同步阻塞,和非同步非阻塞是繫結的。但也有對同步非阻塞,和非同步非阻塞的模型的闡釋,特此記錄解釋。在這套解釋中,同步和非同步的語義不只是立即返回與否,還是獲取結果已完成的方式是通...