阻塞王悍、非阻塞破镰、同步、異步

這幾個概念困擾了我好久压储,現(xiàn)在此做下總結(jié):

阻塞:阻塞通常是指在一個執(zhí)行過程中暫停鲜漩,以等待某個條件的觸發(fā)。(包括IO 阻塞集惋、線程阻塞)

同步/異步:表示的發(fā)出調(diào)用后孕似,被調(diào)用者是否立即返回。

阻塞/非阻塞:表示調(diào)用方線程是否在等待數(shù)據(jù)就緒(例如:Socket通道數(shù)據(jù)是否已讀入內(nèi)存)

以下圖為例解釋一下:其中讀取數(shù)據(jù)分為2個步驟刮刑,1. 內(nèi)核等待數(shù)據(jù)可讀喉祭,2. 將內(nèi)核讀到的數(shù)據(jù)拷貝到進(jìn)程,其中第一個步驟為阻塞的(因為他在等待數(shù)據(jù)就緒)雷绢,而第二個步驟為非阻塞的沽讹。

描述的是從網(wǎng)卡讀取UDP數(shù)據(jù)包的過程

這張圖在第一個步驟中拜银,應(yīng)用進(jìn)程不斷的詢問內(nèi)核,當(dāng)數(shù)據(jù)沒有就緒時,內(nèi)核會立即返回焰檩,此時調(diào)用放線程也并未阻塞著等待數(shù)據(jù)就緒回右,可以做其他事情专控,所以第一個步驟為“異步非阻塞”的沾歪。

而第二個步驟,應(yīng)用進(jìn)程開始系統(tǒng)調(diào)用copy數(shù)據(jù)到用戶空間鸯匹,此時這個調(diào)用沒有立即返回坊饶,再結(jié)合上面的分析,所以這個步驟為“同步非阻塞的”殴蓬。

在Java中實現(xiàn)同步阻塞調(diào)用匿级、異步阻塞調(diào)用、異步非阻塞調(diào)用:

同步阻塞調(diào)用:

public class Test {

    public static void main(String[] args) throws InterruptedException {
        /* 同步阻塞調(diào)用: 
            調(diào)用沒有立即返回 => 同步
            等待了數(shù)據(jù)就緒 => 阻塞
         */
        int result = func();
        func2(result);
    }
    
    public static int func() throws InterruptedException {
        // 模擬(IO)阻塞
        Thread.sleep(1000L);
        
        // 模擬計算操作
        return 1 + 1;
    }

    private static void func2(Integer result) {
        // do something...
    }
}
image

同步非阻塞演示不了

異步阻塞調(diào)用(此處使用join也能表現(xiàn)出來):

public class Test {

    public static void main(String[] args) throws Exception {
        /* 異步阻塞調(diào)用:
            調(diào)用后立即返回 => 異步
            返回后main線程直接獲取結(jié)果染厅,等待了數(shù)據(jù)就緒 => 阻塞
         */
        FutureTask<Integer> futureTask = new FutureTask<>(Test::func);
        new Thread(futureTask).run();

        Integer result = futureTask.get();
        func2(result);
    }

    private static int func() throws InterruptedException {
        // 模擬(IO)阻塞
        Thread.sleep(1000L);

        // 模擬計算操作
        return 1 + 1;
    }
    
    private static void func2(Integer result) {
        // do something...
    }

}
image

異步非阻塞調(diào)用:

public class Test {

    public static void main(String[] args) throws Exception {
        /* 異步非阻塞調(diào)用:
            調(diào)用后立即返回 => 異步
            調(diào)用后main線程直接就不管了痘绎,交由t1線程執(zhí)行后續(xù)的操作,main線程也沒有等待數(shù)據(jù)就緒 => 非阻塞
         */
        CompletableFuture.supplyAsync(() -> func())
                .thenAccept(result -> func2(result));
    }

    private static int func() {
        // 模擬(IO)阻塞
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 模擬計算操作
        return 1 + 1;
    }


    private static void func2(Integer result) {
        // do something...
    }

}
image

https://mp.weixin.qq.com/s/YzpC0BP3K5jEc7qlWtzBTw

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肖粮,一起剝皮案震驚了整個濱河市孤页,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涩馆,老刑警劉巖行施,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件允坚,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛾号,警方通過查閱死者的電腦和手機稠项,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲜结,“玉大人展运,你說我怎么就攤上這事【ⅲ” “怎么了拗胜?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贬养。 經(jīng)常有香客問我挤土,道長,這世上最難降的妖魔是什么误算? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮迷殿,結(jié)果婚禮上儿礼,老公的妹妹穿的比我還像新娘。我一直安慰自己庆寺,他們只是感情好蚊夫,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懦尝,像睡著了一般知纷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陵霉,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天琅轧,我揣著相機與錄音,去河邊找鬼踊挠。 笑死乍桂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的效床。 我是一名探鬼主播睹酌,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剩檀!你這毒婦竟也來了憋沿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沪猴,失蹤者是張志新(化名)和其女友劉穎辐啄,沒想到半個月后采章,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡则披,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年共缕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片士复。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡图谷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阱洪,到底是詐尸還是另有隱情便贵,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布冗荸,位于F島的核電站承璃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚌本。R本人自食惡果不足惜盔粹,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望程癌。 院中可真熱鬧舷嗡,春花似錦、人聲如沸嵌莉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锐峭。三九已至中鼠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沿癞,已是汗流浹背援雇。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抛寝,地道東北人熊杨。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像盗舰,于是被迫代替她去往敵國和親晶府。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容