本文转载自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. golang 的编译安装以及supervisord部署

    go的编译 go的编译相对很简单,只需要一个命令即可完成,进入项目开发路径,输入 go install <appName> 即可在bin文件夹下生成可执行文件 appName.此文件可直接 ...

  2. MBProgressHUD 设置透明背景

    MBProgressHUD 默认使用MBProgressHUDBackgroundStyleBlur 类型 MBProgressHUDBackgroundStyleBlur使用了毛玻璃效果 ,我们要把 ...

  3. 点滴积累【JS】---JS小功能(onmousedown实现鼠标拖拽div移动)

    效果: 思路: 利用onmousedown事件实现拖拽.首先获得鼠标横坐标点和纵坐标点到div的距离,然后当鼠标移动后再用可视区的距离减去横纵坐标与div的距离.然后在判断不让DIV移出可视区,然后再 ...

  4. atitit.软件设计模式大的总结attialx总结

    atitit.软件设计模式大的总结attialx总结 1. 设计模式的历史3 2. 设计模式的数量(253个)3 3. 设计模式的结构4 3.1. 应用场景and条件Context4 3.2. Pro ...

  5. hbase replication原理分析

    本文只是从总体流程来分析replication过程,很多细节没有提及,下一篇文章准备多分析分析细节.   replicationSource启动过程 org.apache.hadoop.hbase.r ...

  6. python学习之logging模块

    Logger.setLevel(level) 设置记录器的级别为level.低于该级别的信息将被忽略. 记录器默认级别为NOTSET.如果记录器是根记录器,则默认将记录所有信息: 如果是一个非根记录器 ...

  7. bootstrap 的使用

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. Compiler Error C2872: ambiguous symbol

    参考资料:http://blog.csdn.net/greytree/article/details/354530 刚才写的程序报错ERROR C2872(CL.exe)原因很简单 ZThread有定 ...

  9. Jquery学习笔记(4)--checkbox全选反选

    可能有浏览器兼容性,注意html里的checked是一个属性,存在就默认选中. <!DOCTYPE html> <html lang="en"> <h ...

  10. 如何利用gdb调试程序?

    程序的大体意思就是各一个数组赋值,然后输出来程序已经写在了上面,下面我们就来看一下如何产生带有调试信息的编译文件,这里我们要使用gcc的-g参数,用于在编译文件中加入一些调试信息.发现加了-g和没有加 ...