Future模式

Future模式是java多線程開(kāi)發(fā)的一種常用模式,它的核心思想是*異步調(diào)用
Future模式類(lèi)似在網(wǎng)上買(mǎi)東西。比如你在淘寶下單買(mǎi)了一步手機(jī),當(dāng)我們支付完成以后,手機(jī)沒(méi)有辦法立即送到家里,但是在電腦上會(huì)產(chǎn)生一個(gè)訂單。這個(gè)訂單就是將來(lái)發(fā)貨或者領(lǐng)取手機(jī)的重要憑證,這個(gè)憑證也就是Future模式會(huì)給出一個(gè)契約。支付結(jié)束以后,你就可以想干嘛干嘛,這個(gè)訂單就成了商家配貨,發(fā)貨的驅(qū)動(dòng)力。當(dāng)然這一切你都不用擔(dān)心,你要做的就是快遞送貨時(shí),收貨就好了。
對(duì)于Future模式來(lái)說(shuō),雖然它無(wú)法立即給你需要的數(shù)據(jù),但是它會(huì)返回一個(gè)契約,將來(lái)你憑借這個(gè)契約取重新獲取你需要的信息即可。

1.JDK中的Future模式

Future接口類(lèi)似于前文面熟的訂單或者說(shuō)是契約。其中Future接口類(lèi)似于前文描述的契約。通過(guò)它可以得到線程執(zhí)行完之后的數(shù)據(jù)。RunnableFuture繼承了Future和Runnable接口,它有一個(gè)具體的實(shí)現(xiàn)類(lèi)FutureTask類(lèi)。Future類(lèi)有一個(gè)內(nèi)部類(lèi)Sync,一些實(shí)質(zhì)性的工作會(huì)委托Sync類(lèi)實(shí)現(xiàn),而Sync類(lèi)最終會(huì)調(diào)用Callable接口,完成實(shí)際數(shù)據(jù)的組裝工作。
Callable接口只有一個(gè)call方法,它會(huì)返回需要構(gòu)造的數(shù)據(jù)。
一個(gè)簡(jiǎn)單的Future使用實(shí)例。

public class RealData implements Callable<String> {
    private String data;
    public RealData(String data){
        this.data=data;
    }
    @Override
    public String call() throws Exception {
        StringBuffer sb=new StringBuffer();
        for (int i=0;i<10;i++){
            sb.append(data);
            Thread.sleep(100);
        }
        return sb.toString();
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> future = new FutureTask<>(new RealData("h"));
        ExecutorService es = Executors.newSingleThreadExecutor();
        es.submit(future);
        System.out.println("請(qǐng)求完畢");
        try{
            //進(jìn)行其他操作,這里使用sleep模擬其他業(yè)務(wù)操作
            Thread.sleep(2000);
        }catch (InterruptedException e){
        }
        //使用future.get得到返回結(jié)果,如果call方法還沒(méi)執(zhí)行完,那么將等待。
        System.out.println("數(shù)據(jù):"+future.get());
    }
}

除了基本功能外,JDK還為future接口提供了一些簡(jiǎn)單的控制功能。

boolean cancel(boolean mayInterruptIfRunning) ; //取消任務(wù)
boolean iscancelled();//是否已經(jīng)取消
boolead isDone();//是否已經(jīng)完成
V get() ;//取得返回對(duì)象
V get(Long timeout,TimeUnit unit);//取得返回對(duì)象,可以設(shè)置超時(shí)時(shí)常
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容