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

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

下面再给出一个关于利用回调配合异步调用的很不错的例子,来源于http://kt8668.iteye.com/blog/205739 回调接口:

  1. public interface CallBack {
  2. /**
  3. * 执行回调方法
  4. * @param objects   将处理后的结果作为参数返回给回调方法
  5. */
  6. public void execute(Object... objects );
  7. }

消息的发送者:

  1. /**
  2. * 这个类相当于你自己
  3. */
  4. public class Local implements CallBack,Runnable{
  5. private Remote remote;
  6. /**
  7. * 发送出去的消息
  8. */
  9. private String message;
  10. public Local(Remote remote, String message) {
  11. super();
  12. this.remote = remote;
  13. this.message = message;
  14. }
  15. /**
  16. * 发送消息
  17. */
  18. public void sendMessage()
  19. {
  20. /**当前线程的名称**/
  21. System.out.println(Thread.currentThread().getName());
  22. /**创建一个新的线程发送消息**/
  23. Thread thread = new Thread(this);
  24. thread.start();
  25. /**当前线程继续执行**/
  26. System.out.println("Message has been sent by Local~!");
  27. }
  28. /**
  29. * 发送消息后的回调函数
  30. */
  31. public void execute(Object... objects ) {
  32. /**打印返回的消息**/
  33. System.out.println(objects[0]);
  34. /**打印发送消息的线程名称**/
  35. System.out.println(Thread.currentThread().getName());
  36. /**中断发送消息的线程**/
  37. Thread.interrupted();
  38. }
  39. public static void main(String[] args)
  40. {
  41. Local local = new Local(new Remote(),"Hello");
  42. local.sendMessage();
  43. }
  44. public void run() {
  45. remote.executeMessage(message, this);  //这相当于给同学打电话,打完电话之后,这个线程就可以去做其他事情了,只不过等到你的同学打回电话给你的时候你要做出响应
  46. }
  47. }

消息的接收者:

  1. /**
  2. * 这个类相当于你的同学
  3. */
  4. public class Remote {
  5. /**
  6. * 处理消息
  7. * @param msg   接收的消息
  8. * @param callBack  回调函数处理类
  9. */
  10. public void executeMessage(String msg,CallBack callBack)
  11. {
  12. /**模拟远程类正在处理其他事情,可能需要花费许多时间**/
  13. for(int i=0;i<1000000000;i++)
  14. {
  15. }
  16. /**处理完其他事情,现在来处理消息**/
  17. System.out.println(msg);
  18. System.out.println("I hava executed the message by Local");
  19. /**执行回调**/
  20. callBack.execute(new String[]{"Nice to meet you~!"});  //这相当于同学执行完之后打电话给你
  21. }
  22. }

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

基础知识《十三》深入浅出Java回调机制的更多相关文章

  1. Java基础9:解读Java回调机制

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  2. 深入浅出Java回调机制

    本文转载自http://hellosure.iteye.com/blog/1130176 在网上看到了一个比喻,觉得很形象,这里借用一下: 你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以 ...

  3. Java 基础之详解 Java 反射机制

    一.什么是 Java 的反射机制?   反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...

  4. java回调机制及其实现(转)

    1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...

  5. Nand Flash基础知识与坏块管理机制的研究

    概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...

  6. Java回调机制总结

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...

  7. 转:一个经典例子让你彻彻底底理解java回调机制

    一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ...

  8. 深入浅出: Java回调机制(异步)

    一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调 ...

  9. Windows_Program_Via_C_Translate_Win32编程的背景知识/基础知识_包括基本输入输出机制介绍

    Some Basic Background Story of The Win32 APIs Win32 API背景故事/背景知识 The Win32 application programming i ...

随机推荐

  1. 【微信小程序】日历插件,适用于酒店订房类小程序

    本插件在原作者(传送门:http://blog.csdn.net/lengyue1084/article/details/71248778)基础上升级. 增加了点击选择具体日期和数据传输功能. 效果图 ...

  2. pandas数据处理基础——基础加减乘除的运算规则

    上周公司对所有员工封闭培训了一个星期,期间没收手机,基本上博客的更新都停止了,尽管培训时间不长,但还是有些收获,不仅来自于培训讲师的,更多的是发现自己与别人的不足,一个优秀的人不仅仅是自己专业那块的精 ...

  3. java之TCP(Socket,serverSocket)实例

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  4. 怎样防止应用因获取IDFA被AppStore拒绝

    由于Appstore禁止不使用广告而採集IDFA的app上架,友盟提供IDFA版和不含IDFA版两个SDK,两个SDK在数据上并没有差异.採集IDFA是为了防止今后由于苹果可能禁止眼下使用的openu ...

  5. Rabbitmq消息队列(五) 路由Routing

    1.简介 在以前一章中,我们可以把一个消息广播给多个接收者.在这一章中,我们会增加一个功能:接收者能够只接收订阅消息中的一个子集. 2.绑定 在我们将交换机和队列进行绑定的时候,我们可以添加一个额外的 ...

  6. Archive将多个对象归档到同一个文件

    使用archiveRootObject:toFile:方法能够将一个对象直接写入到一个文件里.但有时候可能想将多个对象写入到同一个文件里,那么就要使用NSData来进行归档对象. NSData能够为一 ...

  7. Mac / Windows 下的 FTP 工具filezilla

    https://filezilla-project.org/download.php?platform=osx

  8. Mobicents记录1:如何搭建和运行mobicents3.0环境(基于jboss7.2)

    网上能查到的mobicents的资料都是基于比较老的版本,而官网现在已经更新到3.0的版本,很多资料都已经无效,所以把自己的摸索过程记录下来,以便后来者能少走点弯路,快速上手. 闲言少叙,开始正文.. ...

  9. git问题:git提交的时候总是提示key加载失败,总是需要手工将key加到Pageant中

    问题描述: 重装过一次系统,在重装之前git+tortoisegit配合很好,提交的时候都能自动加载ppk,但是重装系统后,也重新生成pulic key上传到了服务器,但是每次提交的时候都提示key加 ...

  10. php socket 模型及效率问题

    // 创建套接字 socket_create(); // 绑定 socket_bind(); // 监听 socket_listen(); // 主体, 死循环 while(true){ // sel ...