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

資訊專欄INFORMATION COLUMN

Java多線程基礎(chǔ)(十一)——Future模式

tinyq / 3386人閱讀

摘要:一定義模式用來獲取線程的執(zhí)行結(jié)果。案例中的類就是參與者參與者接受請(qǐng)求,然后創(chuàng)建線程進(jìn)行異步處理。參與者會(huì)立即返回以的形式。虛擬數(shù)據(jù)參與者是用來統(tǒng)一代表參與者與參與者。

一、定義

Future模式用來獲取線程的執(zhí)行結(jié)果。在Thread-Per-Message模式中,如果調(diào)用一個(gè)線程異步執(zhí)行任務(wù),沒有辦法獲取到返回值,就像:
host.request(10,"A");
而Future模式送出請(qǐng)求后,馬上就要獲取返回值,就像:
Data data=host.request(10,"A");
但是上述的返回值并不是程序的執(zhí)行結(jié)果,因?yàn)榫€程是異步的,主線程調(diào)用該該方法時(shí),異步線程可能才剛剛啟動(dòng)。需要一段時(shí)間后像下面這樣獲取執(zhí)行結(jié)果:
data.getContent();

二、模式案例

Data接口/實(shí)現(xiàn):

public interface Data {
    public abstract String getContent();
}
public class RealData implements Data {
    private final String content;
    public RealData(int count, char c) {
        System.out.println("        making RealData(" + count + ", " + c + ") BEGIN");
        char[] buffer = new char[count];
        for (int i = 0; i < count; i++) {
            buffer[i] = c;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }
        System.out.println("        making RealData(" + count + ", " + c + ") END");
        this.content = new String(buffer);
    }
    public String getContent() {
        return content;
    }
}
public class FutureData implements Data {
    private RealData realdata = null;
    private boolean ready = false;
    public synchronized void setRealData(RealData realdata) {
        if (ready) {
            return;
        }
        this.realdata = realdata;
        this.ready = true;
        notifyAll();
    }
    public synchronized String getContent() {
        while (!ready) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        return realdata.getContent();
    }
}

Host類:

public class Host {
    public Data request(final int count, final char c) {
        System.out.println("    request(" + count + ", " + c + ") BEGIN");
        final FutureData future = new FutureData();
        new Thread() {
            public void run() {
                RealData realdata = new RealData(count, c);
                future.setRealData(realdata);
            }
        }.start();
        System.out.println("    request(" + count + ", " + c + ") END");
        return future;
    }
}

執(zhí)行:

public class Main {
    public static void main(String[] args) {
        System.out.println("main BEGIN");
        Host host = new Host();
        Data data1 = host.request(10, "A");
        Data data2 = host.request(20, "B");
        Data data3 = host.request(30, "C");
?
        System.out.println("main otherJob BEGIN");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        System.out.println("main otherJob END");
        System.out.println("data1 = " + data1.getContent());
        System.out.println("data2 = " + data2.getContent());
        System.out.println("data3 = " + data3.getContent());
        System.out.println("main END");
    }
}
三、模式講解

Future模式的角色如下:

Client(委托人)參與者

Client參與者會(huì)向Host參與者送出請(qǐng)求(request),Client參與者會(huì)馬上得到VirtualData,作為請(qǐng)求結(jié)果的返回值。(案例中的Main類就是Client)

Host參與者

Host參與者接受請(qǐng)求(request),然后創(chuàng)建線程進(jìn)行異步處理。Host參與者會(huì)立即返回Future(以VirturalData的形式)。

VirtualData(虛擬數(shù)據(jù))參與者

VirtualData是用來統(tǒng)一代表Future參與者與RealData參與者。(案例中Data接口就是VirtualData參與者)

RealData(實(shí)際數(shù)據(jù))參與者

RealData表示實(shí)際的數(shù)據(jù)。

Future參與者

Future參與者包含獲取實(shí)際的數(shù)據(jù)和設(shè)置實(shí)際數(shù)據(jù)的方法。Host類會(huì)創(chuàng)建該對(duì)象,當(dāng)異步線程處理完成時(shí),會(huì)調(diào)用Future的設(shè)置數(shù)據(jù)的方法。

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

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

相關(guān)文章

  • java 8 實(shí)戰(zhàn)》讀書筆記 -第十一章 CompletableFuture:組合式異步編程

    摘要:方法接受一個(gè)生產(chǎn)者作為參數(shù),返回一個(gè)對(duì)象,該對(duì)象完成異步執(zhí)行后會(huì)讀取調(diào)用生產(chǎn)者方法的返回值。該方法接收一個(gè)對(duì)象構(gòu)成的數(shù)組,返回由第一個(gè)執(zhí)行完畢的對(duì)象的返回值構(gòu)成的。 一、Future 接口 在Future中觸發(fā)那些潛在耗時(shí)的操作把調(diào)用線程解放出來,讓它能繼續(xù)執(zhí)行其他有價(jià)值的工作,不再需要呆呆等待耗時(shí)的操作完成。打個(gè)比方,你可以把它想象成這樣的場(chǎng)景:你拿了一袋子衣服到你中意的干洗店去洗。...

    zhangqh 評(píng)論0 收藏0
  • Flutter 面試知識(shí)點(diǎn)集錦

    摘要:中的的線程是以事件循環(huán)和消息隊(duì)列的形式存在,包含兩個(gè)任務(wù)隊(duì)列,一個(gè)是內(nèi)部隊(duì)列,一個(gè)是外部隊(duì)列,而的優(yōu)先級(jí)又高于。同時(shí)還有處理按住時(shí)的事件額外處理,同時(shí)手勢(shì)處理一般在的子類進(jìn)行。谷歌大會(huì)之后,有不少人咨詢了我 Flutter 相關(guān)的問題,其中有不少是和面試相關(guān)的,如今一些招聘上也開始羅列 Flutter 相關(guān)要求,最后想了想還是寫一期總結(jié)吧,也算是 Flutter 的階段復(fù)習(xí)。 ??系統(tǒng)完...

    andong777 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第十一章筆記(CompletableFuture:組合式異步編程)

    摘要:組合式異步編程最近這些年,兩種趨勢(shì)不斷地推動(dòng)我們反思我們?cè)O(shè)計(jì)軟件的方式。第章中介紹的分支合并框架以及并行流是實(shí)現(xiàn)并行處理的寶貴工具它們將一個(gè)操作切分為多個(gè)子操作,在多個(gè)不同的核甚至是機(jī)器上并行地執(zhí)行這些子操作。 CompletableFuture:組合式異步編程 最近這些年,兩種趨勢(shì)不斷地推動(dòng)我們反思我們?cè)O(shè)計(jì)軟件的方式。第一種趨勢(shì)和應(yīng)用運(yùn)行的硬件平臺(tái)相關(guān),第二種趨勢(shì)與應(yīng)用程序的架構(gòu)相關(guān)...

    hlcfan 評(píng)論0 收藏0
  • Java SDK 并發(fā)包全面總結(jié)

    摘要:一和并發(fā)包中的和主要解決的是線程的互斥和同步問題,這兩者的配合使用,相當(dāng)于的使用。寫鎖與讀鎖之間互斥,一個(gè)線程在寫時(shí),不允許讀操作。的注意事項(xiàng)不支持重入,即不可反復(fù)獲取同一把鎖。沒有返回值,也就是說無法獲取執(zhí)行結(jié)果。 一、Lock 和 Condition Java 并發(fā)包中的 Lock 和 Condition 主要解決的是線程的互斥和同步問題,這兩者的配合使用,相當(dāng)于 synchron...

    luckyyulin 評(píng)論0 收藏0
  • Java線程進(jìn)階(四二)—— J.U.C之executors框架:Future模式

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

    marek 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<