基础知识《十三》深入浅出Java回调机制

本文转载自http://hellosure.iteye.com/blog/1130176

在网上看到了一个比喻,觉得很形象,这里借用一下:
你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以解决这个问题,但是需要一些时间,那么你不可能一直拿着电话在那里等,你会把你的电话号码告诉他,让他解决之后打电话通知你。回调就是体现在你的同学又反过来拨打你的号码。
结合到前面所分析的,你打电话给你同学就是【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. }    

由上面这个例子可见,回调可以作为异步调用的基础来实现异步调用。

posted @ 2015-07-24 10:50  藤露  阅读(214)  评论(0编辑  收藏  举报