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è)取貨憑證.然后在過(guò)一斷時(shí)間后
          憑取貨憑證來(lái)獲取真正的數(shù)據(jù).
           
          所以連結(jié)調(diào)用者和真實(shí)數(shù)據(jù)之間的橋梁是取貨憑證.我們先來(lái)看它的實(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)單化說(shuō)明(不把它們的關(guān)系開(kāi)得復(fù)雜),這里用Objectb代替了真實(shí)數(shù)據(jù).而真實(shí)的實(shí)現(xiàn)中
          我們應(yīng)該把makeData放在一個(gè)真實(shí)數(shù)據(jù)的類(lèi)中,然后提供一個(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();
            
            //在新線(xiàn)程中調(diào)用耗時(shí)操作
            new Thread(){
             public void run(){
              ft.makeRealData();
             }
            }.start();
            return ft;
           }
          }
          在新線(xiàn)程中啟動(dòng)耗時(shí)操作后,不等待線(xiàn)程的完成立即返回提貨單.
           
          然后調(diào)用者可以根據(jù)ft.isCompleted()來(lái)調(diào)用getData()獲取真實(shí)數(shù)據(jù).
          當(dāng)然對(duì)ft.isCompleted()測(cè)試可以按規(guī)定時(shí)間間隔輪巡(極低級(jí)的方案),也可以
          在條件不滿(mǎn)足時(shí)wait(),然后等待makeData的notifyAll();這樣你就完成了一個(gè)
          用JAVA模擬的異步操作.
           

          改進(jìn):
          但這樣的調(diào)用對(duì)于調(diào)用者來(lái)說(shuō)仍然要繼續(xù)控制線(xiàn)程操作.如果調(diào)用者是一個(gè)資深的
          程序員,這當(dāng)然沒(méi)有問(wèn)題.但假如我們把對(duì)直接數(shù)據(jù)的處理委托給取貨憑證來(lái)做.調(diào)用
          者直接規(guī)定對(duì)數(shù)據(jù)的操作,然后由取貨憑證來(lái)調(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());
            
            //在新線(xiàn)程中調(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 閱讀(22740) 評(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í)例[未登錄](méi) 2013-07-10 15:21 aa

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

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

          這樣的異步有意義嗎?結(jié)果還是得有一個(gè)java線(xiàn)程等待著,如果不是做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à)會(huì)很慢,起一個(gè)線(xiàn)程讓它去發(fā)就可以了,主線(xiàn)程繼續(xù)執(zhí)行業(yè)務(wù)流程。  回復(fù)  更多評(píng)論   

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

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

          # re: java實(shí)現(xiàn)異步調(diào)用實(shí)例[未登錄](méi) 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í)候沒(méi)有具體實(shí)現(xiàn),如果是要調(diào)用My Process Date 類(lèi),這個(gè)類(lèi)又又忘了實(shí)現(xiàn)接口  回復(fù)  更多評(píng)論   


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 衡南县| 宜良县| 辽宁省| 灵台县| 德阳市| 同江市| 五大连池市| 金华市| 涪陵区| 永德县| 津市市| 滨州市| 宜丰县| 荣昌县| 龙川县| 华阴市| 青海省| 天全县| 宿迁市| 乡城县| 万州区| 行唐县| 平原县| 华容县| 安图县| 阿鲁科尔沁旗| 高雄市| 资兴市| 武清区| 法库县| 永仁县| 龙游县| 文山县| 巧家县| 陇川县| 阿尔山市| 五华县| 邵阳市| 股票| 馆陶县| 揭阳市|