摘要:一定義模式用來獲取線程的執(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
摘要:方法接受一個(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)景:你拿了一袋子衣服到你中意的干洗店去洗。...
摘要:中的的線程是以事件循環(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)完...
摘要:組合式異步編程最近這些年,兩種趨勢(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)...
摘要:一和并發(fā)包中的和主要解決的是線程的互斥和同步問題,這兩者的配合使用,相當(dāng)于的使用。寫鎖與讀鎖之間互斥,一個(gè)線程在寫時(shí),不允許讀操作。的注意事項(xiàng)不支持重入,即不可反復(fù)獲取同一把鎖。沒有返回值,也就是說無法獲取執(zhí)行結(jié)果。 一、Lock 和 Condition Java 并發(fā)包中的 Lock 和 Condition 主要解決的是線程的互斥和同步問題,這兩者的配合使用,相當(dāng)于 synchron...
摘要:本文首發(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...
閱讀 1639·2021-11-02 14:42
閱讀 534·2021-10-18 13:24
閱讀 974·2021-10-12 10:12
閱讀 1827·2021-09-02 15:41
閱讀 3216·2019-08-30 15:56
閱讀 2886·2019-08-29 16:09
閱讀 2067·2019-08-29 11:13
閱讀 3632·2019-08-28 18:06