成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

多線程設(shè)計模式 - Future模式

edgardeng / 694人閱讀

摘要:模式是多線程開發(fā)中非常常見的一種設(shè)計模式,它的核心思想是異步調(diào)用。這類似我們?nèi)粘I钪械脑诰€購物流程,帶在購物網(wǎng)看著一件商品時可以提交表單,當(dāng)訂單完成后就可以在家里等待商品送貨上門。內(nèi)部類已經(jīng)實現(xiàn)了模式,后續(xù)再講

Future模式是多線程開發(fā)中非常常見的一種設(shè)計模式,它的核心思想是異步調(diào)用。這類似我們?nèi)粘I钪械脑诰€購物流程,帶在購物網(wǎng)看著一件商品時可以提交表單,當(dāng)訂單完成后就可以在家里等待商品送貨上門?;蛘哒f更形象的是我們發(fā)送Ajax請求的時候,頁面是異步的進行后臺處理,用戶無需等待請求的結(jié)果,可以繼續(xù)瀏覽或操作其他內(nèi)容。

如上圖所示,客戶端調(diào)用購物請求,服務(wù)端程序不等數(shù)據(jù)處理完成便立即返回客戶端一個偽造的數(shù)據(jù),(相當(dāng)于訂單,而不是真實的商品)這時候由服務(wù)端自己偷偷摸摸的發(fā)送了一個other call()請求去獲取真實的商品(打包,出庫,送貨)。這就是Future模式的核心所在。
Future模式的主要角色有:
Main:系統(tǒng)啟動,調(diào)用FutureClient發(fā)出請求
FutureClient:返回Data對象,立即返回FutureData,并開啟線程去獲取RealData
Data:返回數(shù)據(jù)的接口
FutureData:虛擬數(shù)據(jù),返回很快,需要裝載RealData
RealData:真實數(shù)據(jù)
我們來看代碼:
Main:

public class Main {
    public static void main(String[] args) {
        FutureClient fc = new FutureClient();
        Data data = fc.getRequset("jianzh5");
        System.out.println("請求完畢...");
        String result = data.getRequest();
        System.out.println("返回的結(jié)果:"+result);
    }
}

此類主要調(diào)用FutureClient的getRequset方法去返回數(shù)據(jù)
FutureClient:

public class FutureClient {
    public Data getRequset(final String queryStr){
        //初始化代理對象,先返回給客戶端
        final FutureData futureData = new FutureData();
        //啟動一個新的線程去加載真實的數(shù)據(jù),傳遞給這個代理對象
        new Thread(new Runnable() {
            @Override public void run() {
                //此線程去加載真實對象,然后傳遞給代理對象
                RealData realData = new RealData(queryStr);
                futureData.setRealData(realData);
            }
        }).start();
        System.out.println("代理對象返回:"+futureData);
        return futureData;
    }
}

該類在接受到用戶請求后很快就能返回虛擬數(shù)據(jù) futureData,本身啟動一個線程去獲取真實數(shù)據(jù)
RealData:

public class RealData implements Data{
    private String result;

    public RealData(String queryStr){
        System.out.println("根據(jù)參數(shù): "+queryStr+" 進行查詢,這是一個很耗時的操作!");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("裝載完畢,獲取結(jié)果");
        result = "查詢結(jié)果";
    }

    @Override public String getRequest() {
        return result;
    }
}

RealData裝載數(shù)據(jù)較慢,這里使用Sleep(5000)模擬復(fù)雜業(yè)務(wù)邏輯。
FutureData:

public class FutureData implements Data{
    private RealData realData;
    private boolean isReady = false;

    public synchronized void setRealData(RealData realData){
        //如果已經(jīng)裝載完畢則直接返回
        if(isReady){
            return;
        }
        //如果未裝載,進行裝載真實數(shù)據(jù)
        this.realData = realData;
        isReady = true;
        //通知
        notify();
    }

    @Override public synchronized String getRequest() {
        //如果未裝載好一直處于阻塞狀態(tài)
        while (!isReady){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //裝載好直接返回數(shù)據(jù)即可
        return this.realData.getRequest();
    }
}

該類是Future模式的關(guān)鍵,它實際是真實數(shù)據(jù)RealData的代理,封裝了獲取RealData的等待過程實際返回的是真實的數(shù)據(jù)。
JDK內(nèi)部類已經(jīng)實現(xiàn)了Future模式,后續(xù)再講!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69145.html

相關(guān)文章

  • Java線程進階(四二)—— J.U.C之executors框架:Future模式

    摘要:本文首發(fā)于一世流云的專欄一模式簡介模式是多線程設(shè)計模式中的一種常見模式,它的主要作用就是異步地執(zhí)行任務(wù),并在需要的時候獲取結(jié)果。二中的模式在多線程基礎(chǔ)之模式中,我們曾經(jīng)給出過模式的通用類關(guān)系圖。 showImg(https://segmentfault.com/img/bVbiwcx?w=1000&h=667); 本文首發(fā)于一世流云的專欄:https://segmentfault.co...

    marek 評論0 收藏0
  • Java線程基礎(chǔ)(十一)——Future模式

    摘要:一定義模式用來獲取線程的執(zhí)行結(jié)果。案例中的類就是參與者參與者接受請求,然后創(chuàng)建線程進行異步處理。參與者會立即返回以的形式。虛擬數(shù)據(jù)參與者是用來統(tǒng)一代表參與者與參與者。 一、定義 Future模式用來獲取線程的執(zhí)行結(jié)果。在Thread-Per-Message模式中,如果調(diào)用一個線程異步執(zhí)行任務(wù),沒有辦法獲取到返回值,就像:host.request(10,A);而Future模式送出請求后...

    tinyq 評論0 收藏0
  • 談?wù)凱ython協(xié)程技術(shù)的演進

    摘要:事件循環(huán)是異步編程的底層基石。對事件集合進行輪詢,調(diào)用回調(diào)函數(shù)等一輪事件循環(huán)結(jié)束,循環(huán)往復(fù)。協(xié)程直接利用代碼的執(zhí)行位置來表示狀態(tài),而回調(diào)則是維護了一堆數(shù)據(jù)結(jié)構(gòu)來處理狀態(tài)。時代的協(xié)程技術(shù)主要是,另一個比較小眾。 Coding Crush Python開發(fā)工程師 主要負責(zé)豈安科技業(yè)務(wù)風(fēng)險情報系統(tǒng)redq。 引言 1.1. 存儲器山 存儲器山是 Randal Bryant 在《深入...

    zhiwei 評論0 收藏0
  • 并發(fā)編程高級篇一----JDK任務(wù)執(zhí)行框架,Concurrent.util工具類以及鎖的高級深化

    摘要:的多任務(wù)執(zhí)行框架提供了一套線程框架來幫助開發(fā)者有效的進行線程控制,扮演線程工廠的角色,其創(chuàng)建線程的方法如下返回固定數(shù)量的線程池,該方法的線程數(shù)始終不變。 1.Jdk的多任務(wù)執(zhí)行框架 JDK提供了一套線程框架Executor來幫助開發(fā)者有效的進行線程控制,Executors扮演線程工廠的角色,其創(chuàng)建線程的方法如下 newFixedThreadPool() 返回固定數(shù)量的線程池,該方法的...

    Shonim 評論0 收藏0
  • 從JDK11新增HttpClient談?wù)劮亲枞P?/b>

    摘要:是一個倡議,它提倡提供一種帶有非阻塞背壓的異步流處理的標(biāo)準(zhǔn)。是標(biāo)準(zhǔn)的實現(xiàn)之一。的實現(xiàn)細節(jié)請求響應(yīng)的與請求響應(yīng)的暴露為是請求的的消費者是響應(yīng)的的生產(chǎn)者內(nèi)部的內(nèi)部 北京時間 9 月 26 日,Oracle 官方宣布 Java 11 正式發(fā)布 一、JDK HTTP Client介紹 JDK11中的17個新特性 showImg(https://segmentfault.com/img/remo...

    pingan8787 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<