1 什么是回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
例如,在jquery中,我们常常获取后端数据,使用ajax请求,通过回调函数对后端返回的数据做处理,如下代码,success就是一个回调函数,那java能否做到呢?
$.ajax({
url:"demo_test.txt",
success:function(result){
$("#div1").html(result);
}
});
其实一个功能的实现,关键是思想,和语言无关,下面我们介绍下回调函数涉及哪些东西:
主函数:执行其他函数的入口回调函数:一个单独的方法或者文件,供其他函数调用中间函数:将主函数与回调函数关系串联起来的函数最后,回调函数可以根据同步和异步分为同步回调和异步回调,上面jquery的ajax是典型的异步回调。
2 Java实现callback
2.1 同步回调
首先编写回调函数
public interface Callback {
void success();
}
public class FutureCallback implements Callback{
@Override
public void success() {
System.out.println("do success");
}
}
编写中间函数
public class MidFunction {
Callback callback;
public MidFunction(Callback callback) {
this.callback = callback;
}
public void doSomething(){
System.out.println("do something");
callback.success();
}
}
编写主函数
public class Main {
public static void main(String[] args) {
System.out.println("do mian");
FutureCallback futureCallback = new FutureCallback();
MidFunction midFunction = new MidFunction(futureCallback);
midFunction.doSomething();
System.out.println("mian end");
}
}
执行主函数,结果如下,主函数中,只执行了中间函数,但输出结果中回调也执行了,说明中间函数执行了回调函数
do mian //开始执行主函数
do something // 中间函数执行
do success // 回调函数执行
mian end //主函数结束
2.2 异步回调
由于上面的调用,是一个同步函数,我们可以简单修改一下,使它变成异步回调,实现类似ajax的请求。
修改中间函数
public class MidFunction {
Callback callback;
public MidFunction(Callback callback) {
this.callback = callback;
}
public void doSomething(){
System.out.println("do something");
new Thread(() -> callback.success()).start();
}
}
为保证异步效果,我们将回调函数执行时间加长,如下
public class FutureCallback implements Callback{
@Override
public void success() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("do success");
}
}
此时,再执行主函数,结果如下:
do mian // 开始执行主函数
do something // 执行中间函数,异步开始调用回调函数
mian end //主函数继续执行
do success // 回调函数执行完成
3 结论
回调函数是一种思路的实现,与语言无关;回调函数的核心就是将函数的指针传递给其他函数,让其他函数在特定的时候,通过指针调用该回调函数。