Java多線程Future模式

概述

Future是未來的意思艘刚。有個方法需要運行很長時間才能得到結(jié)果截珍。那么,與其一直等待結(jié)果岗喉,不如先拿一張“提貨單”秋度。 獲取提貨單并不需要很長時間荚斯。這里的“提貨單”就是我們稱為Future角色。

先給你一張?zhí)嶝泦巍?/p>

示例程序

  • Main 向Host發(fā)出請求并獲取數(shù)據(jù)的類
  • Host 向請求返回FutureData的實例的類
  • RealData 表示實際數(shù)據(jù)的類。構(gòu)造函數(shù)的處理會花費很長時間

Main類

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");

  }
}

Host類

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

    System.out.println("   request(" + count + ", " + c + ") END");
    return future;
  }
}

Data 接口

public interface Data {
  public abstract String getContent();
}

Future 類

public class FutureData implements Data {
  private RealData realdata = null;
  private boolean ready = false;
  public synchronized void setRealData(RealData realdata) {
    if (ready) {
      return;    // balk
    }

    this.realdata =realdata;
    this.ready = true;
    notifyAll();
  }

 public synchronized String getContent() {
   while (!ready){
      try {
        wait();
      } catch (InterruptedException e) {} 
    } 
    return realdata.getContent();
 }
}

RealData 類

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 (){
      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;
  }
}

Future 模式中的角色

- Client(請求者)
    Client角色向Host角色發(fā)出請求(request)滥壕,并會立即接收到請結(jié)果求的處理(返回值)-- VirtualData角色绎橘。
   這里接收到的VirtualData角色實際上是Future角色。Client角色沒有必要知道返回值究竟是RealData角色還是Future角色唠倦。稍后,Client角色會通過VirtualData角色來進(jìn)行操作稠鼻。
  • Host
    Host角色會創(chuàng)建新的線程,并開始在新線程中創(chuàng)建RealData角色枷餐。同時苫亦,它會將Future角色返回給Client橘色。
  • VirtualData (虛擬數(shù)據(jù))
    VirtualData 角色是讓Future角色與RealData角色具有一致性的角色屋剑。
  • RealData ( 真實數(shù)據(jù))
    RealData角色是表示真實數(shù)據(jù)的角色润匙。
  • Future (提貨單)
    Future角色就是RealData角色的“提貨單“唉匾,由Host角色傳遞給Client角色。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巍膘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子峡懈,更是在濱河造成了極大的恐慌,老刑警劉巖肪康,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異磷支,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)雾狈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茉帅,你說我怎么就攤上這事】芭欤” “怎么了擂错?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵钮呀,是天一觀的道長。 經(jīng)常有香客問我昨凡,道長,這世上最難降的妖魔是什么便脊? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮哪痰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晌杰。我一直安慰自己跷睦,他們只是感情好肋演,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爹殊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪边灭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天绒瘦,我揣著相機(jī)與錄音,去河邊找鬼惰帽。 笑死憨降,一個胖子當(dāng)著我的面吹牛该酗,可吹牛的內(nèi)容都是我干的士嚎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼莱衩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娇澎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤趟庄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戚啥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奋单,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡览濒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匾七。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丁频,靈堂內(nèi)的尸體忽然破棺而出杉允,到底是詐尸還是另有隱情席里,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布奖磁,位于F島的核電站改基,受9級特大地震影響咖为,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躁染,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吞彤。 院中可真熱鬧我衬,春花似錦、人聲如沸挠羔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俱恶。三九已至拌喉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尿背,已是汗流浹背端仰。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工田藐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汽久。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像景醇,于是被迫代替她去往敵國和親臀稚。 傳聞我的和親對象是個殘疾皇子三痰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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