Java NIO(一)I/O模型概述
目錄
基本概念講述
基本概念講述
什麼是同步?
同步就是:如果有多個任務或者事件要發生,這些任務或者事件必須逐個地進行,一個事件或者任務的執行會導致整個流程的暫時等待,這些事件沒有辦法併發地執行。
什麼是異步?
異步就是:如果有多個任務或者事件發生,這些事件可以併發地執行,一個事件或者任務的執行不會導致整個流程的暫時等待
舉個簡單的例子,假如有一個任務包括兩個子任務A和B,對於同步來說,當A在執行的過程中,B只有等待,直至A執行完畢,B才能執行;而對於異步就是A和B可以併發地執行,B不必等待A執行完畢之後再執行,這樣就不會由於A的執行導致整個任務的暫時等待。
重點:
判斷是同步還是異步,就看同時多個任務和事件發生時,一個事件的發生或執行是否會導致整個流程的暫時等待
如果導致整個流程的暫時等待,就是同步;
如果可以並行執行,那就是異步。
代碼示例
同步代碼示例
複製代碼
void fun1() {
}
void fun2() {
}
void function(){
fun1();
fun2();
…
…
}
複製代碼
講解:這段代碼就是典型的同步,在方法function中,fun1在執行的過程中會導致後續的fun2無法執行,fun2必須等待fun1執行完畢纔可以執行。
異步代碼示例
void fun1() {
}
void fun2() {
}
void function(){
new Thread(){
public void run() {
fun1();
}
}.start();
new Thread(){
public void run() {
fun2();
}
}.start();
.....
.....
}
講解:這段代碼是一種典型的異步,fun1的執行不會影響到fun2的執行,並且fun1和fun2的執行不會導致其後續的執行過程處於暫時的等待。
什麼是阻塞?
阻塞就是:當某個事件或者任務在執行過程中,它發出一個請求操作,但是由於該請求操作需要的條件不滿足,那麼就會一直在那等待,直至條件滿足。
什麼是非阻塞?
非阻塞就是:當某個事件或者任務在執行過程中,它發出一個請求操作,如果該請求操作需要的條件不滿足,會立即返回一個標誌信息告知條件不滿足,不會一直在那等待。
舉個簡單的例子:
假如我要讀取一個文件中的內容,如果此時文件中沒有內容可讀,對於阻塞來說就是會一直在那等待,直至文件中有內容可讀;
而對於非阻塞來說,就會直接返回一個標誌信息告知文件中暫時無內容可讀。
這就是阻塞和非阻塞的區別。也就是說阻塞和非阻塞的區別關鍵在於當發出請求一個操作時,如果條件不滿足,是會一直等待還是返回一個標誌信息。
同步和異步着重點在於多個任務的執行過程中,一個任務的執行是否會導致整個流程的暫時等待;
而阻塞和非阻塞着重點在於發出一個請求操作時,如果進行操作的條件不滿足是否會返會一個標誌信息告知條件不滿足。