Future 與 ChannelFuture 異步處理探究

Future 是Java原生API中JUC包下提供的接口娄昆。JUC是Java用來(lái)處理并發(fā)內(nèi)容的集合凛忿,簡(jiǎn)單來(lái)說(shuō)Future就是用來(lái)處理在同步執(zhí)行代碼中獲取異步執(zhí)行結(jié)果的上層接口,其下有多種實(shí)現(xiàn)類用于不同并發(fā)場(chǎng)景冰悠。
原生Future中的get()方法节槐,會(huì)阻塞當(dāng)前線程,知道Future中執(zhí)行的異步任務(wù)完成后锯仪。Netty在原生基礎(chǔ)上又增加了監(jiān)聽(tīng)器(Listener)接口泵督,用來(lái)更精確的控制異步任務(wù)執(zhí)行時(shí)間。

Future常用實(shí)現(xiàn)類

FutureTask

  • 主要繼承關(guān)系:實(shí)現(xiàn)Runnable接口和Future接口
  • 主要功能:可以被看作Runnable對(duì)象提交線程池執(zhí)行庶喜,可以看作Future對(duì)象獲取異步執(zhí)行結(jié)果
簡(jiǎn)單使用示例
package com.ht.actuatorlearn.curr.future;

import java.util.concurrent.*;

/**
 * FutureTask 類示例
 * 線程池異步執(zhí)行任務(wù)小腊,在同步代碼塊中阻塞獲取異步執(zhí)行結(jié)果
 *
 * @author: lht
 * @date: 2023-03-02
 */
public class FutureTaskTest {
    /**
     * 聲明線程池
     */
    private static ExecutorService EXECUTOR = null;

    public static void main(String[] args) {
        EXECUTOR = Executors.newSingleThreadExecutor();
        
        // 創(chuàng)建異步執(zhí)行Future對(duì)象
        FutureTask<String> futureTask = new FutureTask<>(() -> {
            // 注意這里使用的 Callable 類異步執(zhí)行
            // 休眠5s 代替耗時(shí)操作
            TimeUnit.SECONDS.sleep(5);
            return "hello";
        });
        try {
            // 提交執(zhí)行任務(wù)
            EXECUTOR.execute(futureTask);

            // 同步代碼塊1
            System.out.println("Waiting async Results....");

            // 獲取異步執(zhí)行結(jié)果 線程阻塞
            System.out.println("Result is: " + futureTask.get());

            // 同步代碼塊2
            System.out.println("Completed...");

            EXECUTOR.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ScheduledFuture

  • 主要功能:用于獲取在程序中計(jì)劃定期執(zhí)行任務(wù)的結(jié)果
簡(jiǎn)單使用示例
package com.ht.actuatorlearn.curr.future;

import java.util.concurrent.*;

/**
 * 延遲執(zhí)行任務(wù),并在接收到特定結(jié)果下執(zhí)行一系列操作(關(guān)閉任務(wù))
 *
 * @author: lht
 * @date: 2023-03-03
 */
public class ScheduledFutureTest {

    public static void main(String[] args) {
        // 聲明工作線程池
        ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

        // 創(chuàng)建隨機(jī)數(shù)任務(wù)
        Callable<Integer> task = () -> {
            return (int) (Math.random() * 10);
        };

        // 延時(shí)任務(wù)提交線程池
        ScheduledFuture<Integer> schedule = executorService.schedule(task, 5, TimeUnit.SECONDS);

        try {
            Integer result = schedule.get();
            System.out.println("Task Result: " + result);

            // 關(guān)閉線程池
            executorService.shutdown();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ChannelFuture

Netty中久窟,ChannelFuture類似于Future秩冈,表示異步的I/O操作結(jié)果。當(dāng)創(chuàng)建新通道或使用Channel進(jìn)行發(fā)送或接收數(shù)據(jù)時(shí)斥扛,這些耗時(shí)操作在Netty的底層都是異步進(jìn)行處理的入问。如果實(shí)際業(yè)務(wù)邏輯中需要獲取上述異步的執(zhí)行結(jié)果,那就需要使用到ChannelFuture.

常用示例
  1. 添加監(jiān)聽(tīng)器(最常用處理):ChannelFuture基于Future的阻塞模型上又實(shí)現(xiàn)了監(jiān)聽(tīng)器回調(diào)模式稀颁,可以更精確的獲取異步執(zhí)行結(jié)果和操作信息芬失,并且不阻塞主線程
        Object message = new Object();

        // channel 異步發(fā)送數(shù)據(jù)
        ChannelFuture future = ctx.writeAndFlush(message);
        future.addListener((ChannelFutureListener) channelFuture -> {
            if (future.isSuccess()) {
                // 消息發(fā)送成功 回調(diào)
                
            } else {
                // 消息發(fā)送失敗 回調(diào)

            }
        });

2.同步等待操作完成:使用sync()方法可以時(shí)耗時(shí)異步動(dòng)作變?yōu)橥絼?dòng)作,同步等待耗時(shí)操作完成再執(zhí)行后續(xù)代碼

        // 同步推送數(shù)據(jù)
        ChannelFuture channelFuture = ctx.writeAndFlush(message).sync();
        System.out.println(channelFuture.isSuccess());

3.異步等待: 使用ChannelFuture 的 await() 異步等待I/O動(dòng)作完成匾灶,等待中將阻塞當(dāng)前線程麸折,只到操作完成或中斷

        // 阻塞當(dāng)前線程 異步等待
        ChannelFuture channelFuture = ctx.writeAndFlush(message).await();
        System.out.println(channelFuture.isSuccess());

實(shí)際上:從ChannelFuture的源碼中我們可以看到,它其實(shí)是Future的拓展粘昨,并且不具有返回值的異步調(diào)用垢啼,同時(shí)和一個(gè)Channel進(jìn)行綁定。ChannelPromise接口又在其上繼承了ChannelFuture類和Promise類张肾,使之既可以寫異步執(zhí)行結(jié)果芭析,又具備監(jiān)聽(tīng)通道的功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吞瞪,一起剝皮案震驚了整個(gè)濱河市馁启,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芍秆,老刑警劉巖惯疙,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妖啥,居然都是意外死亡霉颠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門荆虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒿偎,“玉大人朽们,你說(shuō)我怎么就攤上這事∷呶唬” “怎么了骑脱?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)苍糠。 經(jīng)常有香客問(wèn)我叁丧,道長(zhǎng),這世上最難降的妖魔是什么岳瞭? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任歹袁,我火速辦了婚禮,結(jié)果婚禮上寝优,老公的妹妹穿的比我還像新娘条舔。我一直安慰自己,他們只是感情好乏矾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布孟抗。 她就那樣靜靜地躺著,像睡著了一般钻心。 火紅的嫁衣襯著肌膚如雪凄硼。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天捷沸,我揣著相機(jī)與錄音摊沉,去河邊找鬼。 笑死痒给,一個(gè)胖子當(dāng)著我的面吹牛说墨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苍柏,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尼斧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了试吁?” 一聲冷哼從身側(cè)響起棺棵,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熄捍,沒(méi)想到半個(gè)月后烛恤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡余耽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年缚柏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宾添。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡船惨,死狀恐怖柜裸,靈堂內(nèi)的尸體忽然破棺而出缕陕,到底是詐尸還是另有隱情粱锐,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布扛邑,位于F島的核電站怜浅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蔬崩。R本人自食惡果不足惜恶座,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沥阳。 院中可真熱鬧跨琳,春花似錦、人聲如沸桐罕。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)功炮。三九已至溅潜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薪伏,已是汗流浹背滚澜。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫁怀,地道東北人设捐。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像塘淑,于是被迫代替她去往敵國(guó)和親挡育。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 隨著業(yè)務(wù)模塊系統(tǒng)越來(lái)越多朴爬,各個(gè)系統(tǒng)的業(yè)務(wù)架構(gòu)變得越來(lái)越錯(cuò)綜復(fù)雜即寒,特別是這幾年微服務(wù)架構(gòu)的興起,跨設(shè)備跨服務(wù)的接口調(diào)...
    日落_3d9f閱讀 2,554評(píng)論 1 1
  • Netty 中大量 I/O 操作都是異步執(zhí)行召噩,本篇博文來(lái)聊聊 Netty 中的異步編程母赵。 Java Future...
    rickiyang閱讀 373評(píng)論 0 1
  • 學(xué)習(xí)目標(biāo) 為什么了解Netty異步監(jiān)聽(tīng)? Netty如何實(shí)現(xiàn)異步監(jiān)聽(tīng)的具滴? Future簡(jiǎn)介 我們知道Netty的I...
    HQG閱讀 294評(píng)論 0 0
  • 概述 Netty的網(wǎng)絡(luò)操作都是異步的凹嘲,在前面Netty的源碼分析中看到,Netty使用了大量的異步回調(diào)處理模式构韵,經(jīng)...
    東方明珠腳下的流浪貓閱讀 831評(píng)論 0 0
  • 簡(jiǎn)介 隨著移動(dòng)互聯(lián)網(wǎng)的蓬勃發(fā)展周蹭,業(yè)務(wù)架構(gòu)也隨之變得錯(cuò)綜復(fù)雜趋艘,業(yè)務(wù)系統(tǒng)越來(lái)越多。通常凶朗,我們處理方法是異步去調(diào)取這些接...
    VirtualR閱讀 442評(píng)論 0 0