tbwshc

          Java模擬異步消息的發送與回調

          本文的目的并不是介紹使用的什么技術,而是重點闡述其實現原理。

           

          一、 異步和同步

          講通俗點,異步就是不需要等當前執行的動作完成,就可以繼續執行后面的動作。

           

          通常一個程序執行的順序是:從上到下,依次執行。后面的動作必須等前面動作執行完成以后方可執行。這就是和異步相對的一個概念——同步。

           

          案例:

          A、張三打電話給李四,讓李四幫忙寫份材料。

          B、李四接到電話的時候,手上有自己的工作要處理,但他答應張三,忙完手上的工作后馬上幫張三寫好材料,并傳真給張三。

          C、通完電話后,張三外出辦事。

           

          說明:

          張三給李四通完電話后,就出去辦事了,他并不需要等李四把材料寫好才外出。那么張三讓李四寫材料的消息就屬于異步消息。

          相反,如果張三必須等李四把材料寫好才能外出辦事的話,那么這個消息就屬于同步消息了。

           

          二、 異步的實現

          傳統的程序執行代碼都是從上到下,一條一條執行的。

          但生活中有很多情況并不是這樣,以上的案例中,如果李四需要幾個小時以后才能幫張三寫好材料的話,那張三就必須等幾個小時,這樣張三可能會崩潰或者抓狂。

           

          這種一條龍似的處理,顯示不太合理。

           

          可以使用以下辦法來處理這種問題:

          張三找王五去給李四打電話,等李四寫好材料后,由王五轉交給張三。這樣張三就可以外出辦其他的事情了。

           

          問題得到了合理的解決,之前張三一條線的工作,由張三和王五兩條線來完成了,兩邊同時進行,彼此不耽誤。

           

          三、 計算機語言的實現

          辦法有了,如何用程序來模擬實現呢?

           

          A、以前由一個線程來處理的工作,可以通過新增一個線程來達到異步的目的。這也就是JAVA中的多線程技術。

          B、最后李四寫好的材料必須交給張三,以做他用。這就是回調。

           

          回調你可以這樣來理解:

          A發送消息給B,B處理好A要求的事情后,將結果返回給A,A再對B返回的結果來做進一步的處理。

           

          四、 Java代碼的實現

          A、 回調的實現

           


          Java代碼tb 
            
          public interface CallBack {   
                
              public void execute(Object... objects );   
           
          public interface CallBack { public void execute(Object... objects ); }

           

          Java是面向對象的語言,因此回調函數就變成了回調接口。

           

          B、 消息的發送者

           


          Javatb代碼
            
          public class Local implements CallBack,Runnable{   
                 
                
              private Remote remote;   
                 
                
              private String message;   
                 
              public Local(Remote remote, String message) {   
                  super();   
                  this.remote remote;   
                  this.message message;   
              }   
            
                
              public void sendMessage()   
              {   
                    
                  System.out.println(Thread.currentThread().getName());   
                    
                  Thread thread new Thread(this);   
                  thread.start();   
                    
                  System.out.println("Message has been sent by Local~!");   
              }   
            
                
              public void execute(Object... objects {   
                    
                  System.out.println(objects[0]);   
                    
                  System.out.println(Thread.currentThread().getName());   
                    
                  Thread.interrupted();   
              }   
                 
              public static void main(String[] args)   
              {   
                  Local local new Local(new Remote(),"Hello");   
                     
                  local.sendMessage();   
              }   
            
              public void run() {   
                  remote.executeMessage(message, this);   
                     
                

          C、 遠程消息的接收者

           

           


          Java代碼
            
          public class Remote {   
            
                
              public void executeMessage(String msg,CallBack callBack)   
              {   
                    
                  for(int i=0;i<1000000000;i++)   
                  {   
                         
                  }   
                    
                  System.out.println(msg);   
                  System.out.println("I hava executed the message by Local");   
                    
                  callBack.execute(new String[]{"Nice to meet you~!"});   
              }   
                 
           
          public class Remote { public void executeMessage(String msg,CallBack callBack) { for(int i=0;i<1000000000;i++) { } System.out.println(msg); System.out.println("I hava executed the message by Local"); callBack.execute(new String[]{"Nice to meet you~!"}); } }

            

          執行Local類的main方法。

           

          注意Local類中紅色背景的那行:

          remote.executeMessage(message, this);

          executeMessage方法需要接收一個message參數,表示發送出去的消息,而CallBack參數是他自己,也就是這里的this。表示發送消息后,由Local類自己來處理,調用自身的execute方法來處理消息結果。

          如果這里不是用this,而是用其他的CallBack接口的實現類的話,那就不能稱之為“回調”了,在OO的世界里,那就屬于“委派”。也就是說,“回調”必須是消息的發送者來處理消息結果,否則不能稱之為回調。這個概念必須明確。

          posted on 2012-07-31 15:35 chen11-1 閱讀(1557) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 鄂伦春自治旗| 清苑县| 德昌县| 景宁| 冀州市| 安庆市| 宜黄县| 资阳市| 巴青县| 榆树市| 松阳县| 桐柏县| 赫章县| 商洛市| 安新县| 德钦县| 通海县| 喜德县| 滕州市| 土默特左旗| 南昌市| 饶阳县| 阿坝县| 兴隆县| 岳池县| 兴化市| 改则县| 莆田市| 盐津县| 景东| 岑巩县| 定结县| 泽普县| 昌邑市| 宣汉县| 合川市| 城口县| 郁南县| 长寿区| 定南县| 莆田市|