深入淺出Java回調機制

來源:互聯網
上載者:User

標籤:

在網上看到了一個比喻,覺得很形象,這裡借用一下:
你有一個複雜的問題解決不了,打電話給你的同學,你的同學說可以解決這個問題,但是需要一些時間,那麼你不可能一直拿著電話在那裡等,你會把你的電話號碼告訴他,讓他解決之後打電話通知你。回調就是體現在你的同學又反過來撥打你的號碼。
結合到前面所分析的,你打電話給你同學就是【you call me】,你同學解決完之後打電話給你就是【i call you back】。

下面再給出一個關於利用回調配合非同步呼叫的很不錯的例子,來源於http://kt8668.iteye.com/blog/205739 回調介面:

Java代碼  
  1. public interface CallBack {    
  2.     /**  
  3.      * 執行回調方法  
  4.      * @param objects   將處理後的結果作為參數返回給回調方法  
  5.      */    
  6.     public void execute(Object... objects );    
  7. }    

訊息的寄件者:

Java代碼  
  1. /** 
  2.  * 這個類相當於你自己 
  3.  */  
  4. public class Local implements CallBack,Runnable{    
  5.      
  6.     private Remote remote;    
  7.         
  8.     /**  
  9.      * 發送出去的訊息  
  10.      */    
  11.     private String message;    
  12.         
  13.     public Local(Remote remote, String message) {    
  14.         super();    
  15.         this.remote = remote;    
  16.         this.message = message;    
  17.     }    
  18.     
  19.     /**  
  20.      * 發送訊息  
  21.      */    
  22.     public void sendMessage()    
  23.     {    
  24.         /**當前線程的名稱**/    
  25.         System.out.println(Thread.currentThread().getName());    
  26.         /**建立一個新的線程發送訊息**/    
  27.         Thread thread = new Thread(this);    
  28.         thread.start();    
  29.         /**當前線程繼續執行**/    
  30.         System.out.println("Message has been sent by Local~!");    
  31.     }    
  32.     
  33.     /**  
  34.      * 發送訊息後的回呼函數  
  35.      */    
  36.     public void execute(Object... objects ) {    
  37.         /**列印返回的訊息**/    
  38.         System.out.println(objects[0]);    
  39.         /**列印發送訊息的線程名稱**/    
  40.         System.out.println(Thread.currentThread().getName());    
  41.         /**中斷髮送訊息的線程**/    
  42.         Thread.interrupted();    
  43.     }    
  44.         
  45.     public static void main(String[] args)    
  46.     {    
  47.         Local local = new Local(new Remote(),"Hello");    
  48.             
  49.         local.sendMessage();    
  50.     }    
  51.     
  52.     public void run() {    
  53.         remote.executeMessage(message, this);  //這相當於給同學打電話,打完電話之後,這個線程就可以去做其他事情了,只不過等到你的同學打回電話給你的時候你要做出響應  
  54.             
  55.     }    
  56. }    

訊息的接收者:

Java代碼  
  1. /** 
  2.  * 這個類相當於你的同學 
  3.  */  
  4. public class Remote {    
  5.     
  6.     /**  
  7.      * 處理訊息  
  8.      * @param msg   接收的訊息  
  9.      * @param callBack  回呼函數處理類  
  10.      */    
  11.     public void executeMessage(String msg,CallBack callBack)    
  12.     {    
  13.         /**類比遠程類正在處理其他事情,可能需要花費許多時間**/    
  14.         for(int i=0;i<1000000000;i++)    
  15.         {    
  16.                 
  17.         }    
  18.         /**處理完其他事情,現在來處理訊息**/    
  19.         System.out.println(msg);    
  20.         System.out.println("I hava executed the message by Local");    
  21.         /**執行回調**/    
  22.         callBack.execute(new String[]{"Nice to meet you~!"});  //這相當於同學執行完之後打電話給你  
  23.     }    
  24.         
  25. }    

由上面這個例子可見,回調可以作為非同步呼叫的基礎來實現非同步呼叫。

深入淺出Java回調機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.