java基础-回调函数(callback)
java基础-回调函数(callback)
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
在C和C++中有回调函数数一个显而易见的东西,但是在Java中它没有这个机制,只能我们手动实现。本篇博客就用Java实现一个简单的回调函数案例。
一.Java回调机制
1>.Class A 实现接口 CallBack callback;
2>.Class A 中包含一个lB的引用b;
3>.Class B 有一个参数为callback 的方法f(CallBack callback);
4>.Class A的对象a调用Class B方法f(CallBack callback),换句话说,就是A类调用B类的某个方法c;
5>.然后b就可以在f(CallBack callback)方法中调用A的方法,换句话说就是B类调用A类的某个方法d;
二.案例展示
1>.场景分析
马上快到周五了,小明想要跟他的女朋友一起去看电影,以下是他们的通话记录:
小明说:[亲爱的,周五有部电影要首映,我关注了好久,我们一起去看吧,从19:00~23:30都可以看,你啥时候下班呢?]
小红说:[啊~啊~好刺激呀,我在吃辣条呢,一会打给你]
小明说:[那我先忙手上的工作了!]
小红说:[下班我回家换套衣服,要不晚上10:30不见不散!]
2>.代码实现
CallBack.java 代码如下:
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; public interface CallBack {
/**
* 这是小红知道答案时要调用的函数告诉小明,也就是回调函数,这个接口我是可以自定义哟。
*/
public abstract void resolv(String result);
}
XiaoMing.java 文件内容如下:
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; /**
* 这是小明
* 实现了一个回调接口CallBack。
*/
public class XiaoMing implements CallBack {
/**
* 创建一个对小红对象的引用
*/
private XiaoHong xiaohong;
/**
* 小明的构造方法,持有对Xiaohong的引用
*/
public XiaoMing(XiaoHong xiaohong) {
this.xiaohong = xiaohong;
} public XiaoMing() { } /**
* 小明通过这个方法去问小红问题
*/
public void askQuestion(final String question) throws InterruptedException {
Thread ask = new Thread() {
@Override
public void run() {
try {
xiaohong.execute(XiaoMing.this, question);
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
ask.start();
// ask.join();
//小明问完问题挂掉电话就去忙工作上的事情了
work();
} public void work(){
String work = "小明说:[那我先忙手上的工作了!]";
System.out.println(work);
} /**
* 这是小红确定了看电影的具体时间,调用此方法告诉小明,就是所谓的小明的回调方法。
*/
public void resolv(String result) {
System.out.printf("小红说:[%s]\n",result);
}
}
XiaoHong.java 文件内容如下:
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; /**
* 这个就是小红
*/
public class XiaoHong {
/**
*小明问的问题
*/
public void execute(CallBack callBack ,String question) throws InterruptedException {
System.out.println(question);
//模拟小红办自己的事情需要很长时间
System.out.println("小红说:[啊~啊~好刺激呀,我在吃辣条呢,一会打给你]");
Thread.sleep(10000);
//小红办完自己的事情之后就想到了答案是“晚上加班,去不了啦,下次吧!”
String result = "下班我回家换套衣服,要不晚上10:30不见不散!";
/**
* 于是就打电话告诉小明,调用小明中的方法。
*/
callBack.resolv(result);
}
}
Demo.java 文件内容如下:
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; public class Demo {
public static void main(String[] args) throws InterruptedException {
XiaoHong xiaoHong = new XiaoHong();
XiaoMing xiaoMing = new XiaoMing(xiaoHong); String question = "小明说:[亲爱的,周五有部电影要首映,我关注了好久,我们一起去看吧,从19:00~23:30都可以看,你啥时候下班呢?]";
xiaoMing.askQuestion(question);
}
}
3>.小结
xiaoMing调用xiaoHong的execute方法,xiaoHong在execute方法中通过CallBack接口调用xiaoMing的resolve。
java基础-回调函数(callback)的更多相关文章
- js回调函数(callback)理解
Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...
- JS回调函数(callback)
在使用Jquery的时候,用到Callback(),回调函数的概念.而且很多. 比如: $.ajax({ url:"test.json", type: "GET" ...
- 理解javascript中的回调函数(callback)
以下内容来源于:http://www.jb51.net/article/54641.htm 最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs ...
- 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)
由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...
- 理解javascript中的回调函数(callback)【转】
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...
- C++回调函数(callback)的使用
什么是回调函数(callback) 模块A有一个函数foo,他向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事 ...
- 回调函数callback使用例子
代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <tit ...
- java基础--常用函数总结
java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.flo ...
- [转]C++回调函数(callback)的使用
原文地址:http://blog.sina.com.cn/s/blog_6568e7880100p77y.html 什么是回调函数(callback) 模块A有一个函数foo,他向模块B传递fo ...
随机推荐
- Chapter 4 需求工程
软件需求是用户解决问题或达到目的所需的条件或能力,以及系统或系统部件要满足合同.标准.规范或其他正式规定文档所需要的条件和能力.软件需求可以划分为业务需求.用户需求.系统需求.功能需求和非功能需求等类 ...
- 今年暑假要AC
今年暑假要AC 在这个大学的第一个的暑假,谁不想回去high呢~ 但是,这是不行的,还没有AC,你能回去吗?高三那年的暑假怎么玩的,现在补回来吧...有规模有计划有氛围的学习就是:优点多效率好激情足~ ...
- 学术诚信与职业道德——《构建之法》P384~391读后感
程序本身没有伦理和职业道德, 但是程序员和软件企业要有,因为程序员明白伦理道德的存在. 对于刚刚经历被不负责队友抛下的经历,对此很有感触,软件工程师除了遵守任务做事,也要考虑道德上.责任上的事情. 就 ...
- 对it行业的一些看法
随着世界产业转移的加速,欧美.日本等发达国家将大量的软件开发业务转移到中国.印度等国家,随之而来的是这些国家对it人才的急切需求! 对比国内的大学生就业形势而言,无疑是it相关专业的毕业生就业压力较少 ...
- HDU 2103 Family planning
http://acm.hdu.edu.cn/showproblem.php?pid=2103 Problem Description As far as we known,there are so m ...
- 前端切图相关ps技术
标签(空格分隔): 前端切图 复制图层到一个新的ps文件 对于单个图层 1.选中图层 2.CTRL+A全选 3.CTRL+C 4.CTRL+N新建文件,文件大小默认就可以(背景透明也在这个面板设置), ...
- Log4j读取配置文件并使用
/** 设置配置路径从环境变量读取 * PropertyConfigurator类加载.properties文件的配置 * DOMConfigurator加载.xml文件的配置 ...
- mysql 读写锁
1. 表读锁 lock table tablename read; 例如: 从上图中可以看到,当给表a加了读锁之后,该进程本身对表a是可读的,但是不可写,再看在另外一个进程中: 在另外一个进程中表a也 ...
- 【bzoj4591】[Shoi2015]超能粒子炮·改 Lucas定理
题目描述 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ...
- Qss 样式表的尝试
QLineEdit{ border:1px solid #137eb6; padding:2px; background-color:#F5F5F5; } QToolTip{ border:1px s ...