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

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

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

    tbwshc

    java實現異步調用實例

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

    改進:
    但這樣的調用對于調用者來說仍然要繼續控制線程操作.如果調用者是一個資深的
    程序員,這當然沒有問題.但假如我們把對直接數據的處理委托給取貨憑證來做.調用
    者直接規定對數據的操作,然后由取貨憑證來調用規定的操作,這對于調用者是一個很
    好的解脫:
     
    interface ProcessData{
     public void process(Onject data);
    }
     
    public MyProcessData{
     public void process(Object data){
      //你不管什么時候起初數據data被獲取了.
      //你只要規定如果獲取到數據了如何處理
      
      System.out.println(data.toString() "處理完成...........");
      //insert into dataBase?
     }
    }
     
    取貨憑證在接收調用者請求獲取數據時,要知道對獲取的數據如何處理的方法:
     
    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;
      //獲取數據的耗時操作.這里用Sleep代替
      try{
       Thread.sleep(10000);
      }catch(Throwable t){}
      this.data "返回的數據內容";
      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(?);
      
     }
     

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

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

    Feedback

    # re: java實現異步調用實例 2012-09-11 21:51 屈原

    不行啊 調用錯誤  回復  更多評論   

    # re: java實現異步調用實例 2012-09-11 21:52 趙芳

    緊急求教 qq 13691261654  回復  更多評論   

    # re: java實現異步調用實例 2013-06-20 18:34 <script>alert(XSS)</script>

    alert(XSS)  回復  更多評論   

    # re: java實現異步調用實例[未登錄] 2013-07-10 15:21 aa

    這種方式就是公用狀態,等待狀態變化再處理結果,掉方法一直都耗時在等待啊, 不太好吧  回復  更多評論   

    # re: java實現異步調用實例[未登錄] 2013-07-31 22:58

    這樣的異步有意義嗎?結果還是得有一個java線程等待著,如果不是做Swing的java應用,這種異步,用了不如不用。  回復  更多評論   

    # re: java實現異步調用實例 2013-11-01 17:13 mashiguang

    還有是意義的,比如需要執行某個操作,但不想等待該操作執行,就可以用這種方式了。
    比如,業務流程里需要發郵件,而等待發郵件的話會很慢,起一個線程讓它去發就可以了,主線程繼續執行業務流程。  回復  更多評論   

    # re: java實現異步調用實例[未登錄] 2014-07-30 16:08 aa

    寫的不錯,支持!!!  回復  更多評論   

    # re: java實現異步調用實例[未登錄] 2014-07-30 16:09 aobama

    支持!!!  回復  更多評論   

    # re: java實現異步調用實例 2014-10-08 23:28 潦草白紙

    你的Process Date接口在調用的時候沒有具體實現,如果是要調用My Process Date 類,這個類又又忘了實現接口  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲六月丁香六月婷婷色伊人| 亚洲AV日韩AV永久无码绿巨人| 亚洲一区无码中文字幕乱码| 亚洲视频在线免费观看| a毛片成人免费全部播放| 亚洲一级免费视频| 亚洲福利一区二区三区| 1000部羞羞禁止免费观看视频| 在线视频免费国产成人 | 成人亚洲网站www在线观看| 亚洲av日韩av永久无码电影| 在线观看亚洲免费| 性生大片视频免费观看一级 | 日韩免费视频观看| 色婷婷精品免费视频| 97国产免费全部免费观看| 亚洲性色成人av天堂| a毛片在线还看免费网站| 国产区卡一卡二卡三乱码免费| 国产亚洲欧美日韩亚洲中文色| 亚洲 自拍 另类小说综合图区| 在线观看免费视频网站色| 亚洲午夜视频在线观看| 人妻视频一区二区三区免费| 国产亚洲精品国产福利在线观看| 亚洲国产精品综合久久网络| 久久免费国产精品一区二区| 亚洲中文字幕久在线| 亚洲AV无码乱码在线观看| 中文字幕无码免费久久| 亚洲精品天堂在线观看| 中文毛片无遮挡高潮免费| 亚洲爆乳大丰满无码专区| 久久亚洲国产欧洲精品一| 国产乱码免费卡1卡二卡3卡| 七次郎成人免费线路视频| 亚洲欧洲日产国码高潮αv| 人妻无码一区二区三区免费 | 亚洲香蕉久久一区二区| 亚洲一区二区三区免费视频| 亚洲妇女无套内射精|