<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    tbwshc

    java實(shí)現(xiàn)異步調(diào)用實(shí)例

    在JAVA平臺(tái),實(shí)現(xiàn)異步調(diào)用的角色有如下三個(gè)角色:
     
    調(diào)用者 取貨憑證   真實(shí)數(shù)據(jù)
     
    一個(gè)調(diào)用者在調(diào)用耗時(shí)操作,不能立即返回?cái)?shù)據(jù)時(shí),先返回一個(gè)取貨憑證.然后在過一斷時(shí)間后
    憑取貨憑證來獲取真正的數(shù)據(jù).
     
    所以連結(jié)調(diào)用者和真實(shí)數(shù)據(jù)之間的橋梁是取貨憑證.我們先來看它的實(shí)現(xiàn):
     
    public class FutureTicket{
     private Object data null;
     private boolean completed false;
     
     public synchronized void makeRealData(){
      if(this.complited) return;
      //獲取數(shù)據(jù)的耗時(shí)操作.這里用Sleep代替
      try{
       Thread.sleep(10000);
      }catch(Throwable t){}
      this.data "返回的數(shù)據(jù)內(nèi)容";
      this.completed true;
      notifyAll();
     }
     
     public synchronized Object getData(){
      while(!this.completed)){
       try{
        wait();
       }catch(Throwable t){}
      }
      return this.data;
      
     }
     public boolean isCompleted(){
      return this.completed;
     }
    }
     
    為了簡(jiǎn)單化說明(不把它們的關(guān)系開得復(fù)雜),這里用Objectb代替了真實(shí)數(shù)據(jù).而真實(shí)的實(shí)現(xiàn)中
    我們應(yīng)該把makeData放在一個(gè)真實(shí)數(shù)據(jù)的類中,然后提供一個(gè)方法返回真實(shí)數(shù)據(jù).這樣對(duì)于真實(shí)
    數(shù)據(jù)的處理和取貨憑證解耦.
     
    對(duì)于這個(gè)取貨憑證,調(diào)用者的如何調(diào)用是異步調(diào)用的關(guān)鍵:
     
    publc class Requester{
     public FutureTicket request(){
      final FutureTicket ft new FutureTicket();
      
      //在新線程中調(diào)用耗時(shí)操作
      new Thread(){
       public void run(){
        ft.makeRealData();
       }
      }.start();
      return ft;
     }
    }
    在新線程中啟動(dòng)耗時(shí)操作后,不等待線程的完成立即返回提貨單.
     
    然后調(diào)用者可以根據(jù)ft.isCompleted()來調(diào)用getData()獲取真實(shí)數(shù)據(jù).
    當(dāng)然對(duì)ft.isCompleted()測(cè)試可以按規(guī)定時(shí)間間隔輪巡(極低級(jí)的方案),也可以
    在條件不滿足時(shí)wait(),然后等待makeData的notifyAll();這樣你就完成了一個(gè)
    用JAVA模擬的異步操作.
     

    改進(jìn):
    但這樣的調(diào)用對(duì)于調(diào)用者來說仍然要繼續(xù)控制線程操作.如果調(diào)用者是一個(gè)資深的
    程序員,這當(dāng)然沒有問題.但假如我們把對(duì)直接數(shù)據(jù)的處理委托給取貨憑證來做.調(diào)用
    者直接規(guī)定對(duì)數(shù)據(jù)的操作,然后由取貨憑證來調(diào)用規(guī)定的操作,這對(duì)于調(diào)用者是一個(gè)很
    好的解脫:
     
    interface ProcessData{
     public void process(Onject data);
    }
     
    public MyProcessData{
     public void process(Object data){
      //你不管什么時(shí)候起初數(shù)據(jù)data被獲取了.
      //你只要規(guī)定如果獲取到數(shù)據(jù)了如何處理
      
      System.out.println(data.toString() "處理完成...........");
      //insert into dataBase?
     }
    }
     
    取貨憑證在接收調(diào)用者請(qǐng)求獲取數(shù)據(jù)時(shí),要知道對(duì)獲取的數(shù)據(jù)如何處理的方法:
     
    public class FutureTicket{
     private Object data null;
     private boolean completed false;
     private ProcessData pd;
     
     public FutureTicket(ProcessData pd){
      this.pd pd;
     }
     public synchronized void makeRealData(ProcessData pd){
      if(this.complited) return;
      //獲取數(shù)據(jù)的耗時(shí)操作.這里用Sleep代替
      try{
       Thread.sleep(10000);
      }catch(Throwable t){}
      this.data "返回的數(shù)據(jù)內(nèi)容";
      this.completed true;
      notifyAll();
     }
     
     public synchronized void putData(){
      while(!this.completed)){
       try{
        wait();
       }catch(Throwable t){}
      }
      //return this.data;
      //不用返回了,直接處理
      this.pd.process(this.data);
      // alert(?);
      
     }
     

     //這個(gè)方法也可以不要了.
     public boolean isCompleted(){
      return this.completed;
     }
    }
     
    調(diào)用:
     
      final FutureTicket ft new FutureTicket(new ProcessData());
      
      //在新線程中調(diào)用耗時(shí)操作
      new Thread(){
       public void run(){
        ft.makeRealData();
       }
      }.start();
      ft.putData();
     
    OK,你現(xiàn)在可以抽煙,喝酒,泡妞.ft會(huì)為你完成所有的工作.

    posted on 2012-07-31 15:16 chen11-1 閱讀(22736) 評(píng)論(9)  編輯  收藏

    Feedback

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例 2012-09-11 21:51 屈原

    不行啊 調(diào)用錯(cuò)誤  回復(fù)  更多評(píng)論   

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例 2012-09-11 21:52 趙芳

    緊急求教 qq 13691261654  回復(fù)  更多評(píng)論   

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例 2013-06-20 18:34 <script>alert(XSS)</script>

    alert(XSS)  回復(fù)  更多評(píng)論   

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例[未登錄] 2013-07-10 15:21 aa

    這種方式就是公用狀態(tài),等待狀態(tài)變化再處理結(jié)果,掉方法一直都耗時(shí)在等待啊, 不太好吧  回復(fù)  更多評(píng)論   

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例[未登錄] 2013-07-31 22:58

    這樣的異步有意義嗎?結(jié)果還是得有一個(gè)java線程等待著,如果不是做Swing的java應(yīng)用,這種異步,用了不如不用。  回復(fù)  更多評(píng)論   

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例 2013-11-01 17:13 mashiguang

    還有是意義的,比如需要執(zhí)行某個(gè)操作,但不想等待該操作執(zhí)行,就可以用這種方式了。
    比如,業(yè)務(wù)流程里需要發(fā)郵件,而等待發(fā)郵件的話會(huì)很慢,起一個(gè)線程讓它去發(fā)就可以了,主線程繼續(xù)執(zhí)行業(yè)務(wù)流程。  回復(fù)  更多評(píng)論   

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例[未登錄] 2014-07-30 16:08 aa

    寫的不錯(cuò),支持!!!  回復(fù)  更多評(píng)論   

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例[未登錄] 2014-07-30 16:09 aobama

    支持!!!  回復(fù)  更多評(píng)論   

    # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例 2014-10-08 23:28 潦草白紙

    你的Process Date接口在調(diào)用的時(shí)候沒有具體實(shí)現(xiàn),如果是要調(diào)用My Process Date 類,這個(gè)類又又忘了實(shí)現(xiàn)接口  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久精品国产亚洲AV电影网| 国产综合激情在线亚洲第一页| 100000免费啪啪18免进| 国产成+人+综合+亚洲专| 免费国产美女爽到喷出水来视频| 中文字幕乱码系列免费| 亚洲妇女水蜜桃av网网站| 免费永久在线观看黄网站| 久久精品免费观看国产| 亚洲第一第二第三第四第五第六 | 无码国模国产在线观看免费| 搜日本一区二区三区免费高清视频| 亚洲Aⅴ无码专区在线观看q| 思思99re66在线精品免费观看| 国产高清视频免费在线观看| 亚洲欧洲国产综合| 亚洲精品高清在线| 无码中文字幕av免费放| CAOPORN国产精品免费视频| 亚洲an日韩专区在线| 红杏亚洲影院一区二区三区| 动漫黄网站免费永久在线观看| 曰批免费视频播放在线看片二| 亚洲成a人不卡在线观看| 中文字幕亚洲日本岛国片| 成人免费视频小说| 久久午夜夜伦鲁鲁片免费无码| 理论秋霞在线看免费| 亚洲AV综合色区无码二区爱AV| 免费a级毛片无码a∨性按摩| 久久久久国产精品免费免费不卡| 亚洲成年网站在线观看| yy6080久久亚洲精品| 四虎影视在线影院在线观看免费视频| 久久精品国产亚洲av日韩| 无码av免费毛片一区二区| 9久久免费国产精品特黄| 亚洲一区二区三区不卡在线播放| 亚洲婷婷国产精品电影人久久| 精品国产免费人成电影在线观看| 日本一区二区在线免费观看|