基础知识《十三》深入浅出Java回调机制
本文转载自http://hellosure.iteye.com/blog/1130176
在网上看到了一个比喻,觉得很形象,这里借用一下:
你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以解决这个问题,但是需要一些时间,那么你不可能一直拿着电话在那里等,你会把你的电话号码告诉他,让他解决之后打电话通知你。回调就是体现在你的同学又反过来拨打你的号码。
结合到前面所分析的,你打电话给你同学就是【you call me】,你同学解决完之后打电话给你就是【i call you back】。
下面再给出一个关于利用回调配合异步调用的很不错的例子,来源于http://kt8668.iteye.com/blog/205739 回调接口:
- public interface CallBack {
- /**
- * 执行回调方法
- * @param objects 将处理后的结果作为参数返回给回调方法
- */
- public void execute(Object... objects );
- }
消息的发送者:
- /**
- * 这个类相当于你自己
- */
- 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); //这相当于给同学打电话,打完电话之后,这个线程就可以去做其他事情了,只不过等到你的同学打回电话给你的时候你要做出响应
- }
- }
消息的接收者:
- /**
- * 这个类相当于你的同学
- */
- public class Remote {
- /**
- * 处理消息
- * @param msg 接收的消息
- * @param callBack 回调函数处理类
- */
- 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~!"}); //这相当于同学执行完之后打电话给你
- }
- }
由上面这个例子可见,回调可以作为异步调用的基础来实现异步调用。
基础知识《十三》深入浅出Java回调机制的更多相关文章
- Java基础9:解读Java回调机制
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 深入浅出Java回调机制
本文转载自http://hellosure.iteye.com/blog/1130176 在网上看到了一个比喻,觉得很形象,这里借用一下: 你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以 ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- java回调机制及其实现(转)
1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...
- Nand Flash基础知识与坏块管理机制的研究
概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...
- Java回调机制总结
调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...
- 转:一个经典例子让你彻彻底底理解java回调机制
一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ...
- 深入浅出: Java回调机制(异步)
一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调 ...
- Windows_Program_Via_C_Translate_Win32编程的背景知识/基础知识_包括基本输入输出机制介绍
Some Basic Background Story of The Win32 APIs Win32 API背景故事/背景知识 The Win32 application programming i ...
随机推荐
- 尚学堂 hadoop
mr spark storm 都是分布式计算框架,他们之间不是谁替换谁的问题,是谁适合做什么的问题. mr特点,移动计算,而不移动数据. 把我们的计算程序下发到不同的机器上面运行,但是不移动数据. 每 ...
- docker 中 安装 openssh-server
1,首先,需要从docker官网获得centos或Ubuntu镜像 2,当本地已有Ubuntu镜像后(大概200M左右大小),使用如下命令 docker run -t -i ubuntu /bin/b ...
- c++继承总结
继承 1)继承是面向对象程序设计实现软件重用的重要方法.程序猿能够在已有基类的基础上定义新的派生类. 2) 单继承的派生类仅仅有一个基类.多继承的派生类有多个基类. 3) 派生类对基类成员的訪问由继承 ...
- Python-Mac OS X EI Capitan下安装Scrapy
sudo pip install scrapy --ignore-installed six #sudo pip install scrapy --upgrade --ignore-installed ...
- resin设置jvm参数
http://www.quiee.com.cn/archives/592/ resin resin3.0 及前期版本内存设置, 如下: 启动时设置虚拟内存: unix> bin/httpd.sh ...
- JS 毫秒日期相互转换 JS获取 今天 明天 昨天的日期
var dd = new Date(); var AddDayCount = 0; //0 今天 1 明天 -1 昨天 以此类推 dd.setDate(dd.getDate() + AddDayCou ...
- angularJS使用内置服务
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- 通过SectionIndexer实现微信通讯录
这里主要参考了使用SectionIndexer实现微信通讯录的效果 在这里做个记录 效果图 页面使用RelativeLayout,主要分为三个部分,match_parent的主listView,右边字 ...
- Mac 全局变量 ~/.bash_profile 文件不存在的问题
不存在就新建呗~ $ cd ~/ $ touch .bash_profile $ open -e .bash_profile 然后输入以下内容 # set color的部分是配置iterm2的字体颜色 ...
- Wpf 抽屉效果
在android开发中有抽屉效果,就是在页面的边上有一个按钮,可以通过点击或者拖拽这个按钮,让页面显示.Wpf也可以实现相同的效果. 主要是通过一个DoubleAnimation和RectAnimat ...