tbwshc

          Java模擬異步消息的發(fā)送與回調(diào)

          本文的目的并不是介紹使用的什么技術(shù),而是重點(diǎn)闡述其實(shí)現(xiàn)原理。

           

          一、 異步和同步

          講通俗點(diǎn),異步就是不需要等當(dāng)前執(zhí)行的動(dòng)作完成,就可以繼續(xù)執(zhí)行后面的動(dòng)作。

           

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

           

          案例:

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

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

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

           

          說明:

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

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

           

          二、 異步的實(shí)現(xiàn)

          傳統(tǒng)的程序執(zhí)行代碼都是從上到下,一條一條執(zhí)行的。

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

           

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

           

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

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

           

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

           

          三、 計(jì)算機(jī)語言的實(shí)現(xiàn)

          辦法有了,如何用程序來模擬實(shí)現(xiàn)呢?

           

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

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

           

          回調(diào)你可以這樣來理解:

          A發(fā)送消息給B,B處理好A要求的事情后,將結(jié)果返回給A,A再對(duì)B返回的結(jié)果來做進(jìn)一步的處理。

           

          四、 Java代碼的實(shí)現(xiàn)

          A、 回調(diào)的實(shí)現(xiàn)

           


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

           

          Java是面向?qū)ο蟮恼Z言,因此回調(diào)函數(shù)就變成了回調(diào)接口。

           

          B、 消息的發(fā)送者

           


          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、 遠(yuǎn)程消息的接收者

           

           


          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~!"}); } }

            

          執(zhí)行Local類的main方法。

           

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

          remote.executeMessage(message, this);

          executeMessage方法需要接收一個(gè)message參數(shù),表示發(fā)送出去的消息,而CallBack參數(shù)是他自己,也就是這里的this。表示發(fā)送消息后,由Local類自己來處理,調(diào)用自身的execute方法來處理消息結(jié)果。

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

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 岢岚县| 诸城市| 丰原市| 金华市| 延庆县| 灵寿县| 资兴市| 太和县| 色达县| 台南市| 姜堰市| 江西省| 灵丘县| 东港市| 房山区| 肥乡县| 古交市| 望都县| 安达市| 汉中市| 富川| 民勤县| 彩票| 儋州市| 陆良县| 青州市| 宽城| 都兰县| 光泽县| 横山县| 桐梓县| 绥滨县| 渭源县| 乌海市| 鄂州市| 黎城县| 邵武市| 濮阳市| 永川市| 岳池县| 大厂|