引用1:https://kt8668.iteye.com/blog/205739
引用2:https://hellosure.iteye.com/blog/1130176
引用3:https://blog.csdn.net/xiaanming/article/details/8703708
在学习Spring Boot时候,看到了回调函数,以前学习过的现在又忘记了,想着这次学习然后记录下来,以备以后复习。
调用方式
在软件中,各个模块之间需要互相调用,调用方式有同步调用与异步调用。
同步调用
class A中方法methodA需要调用class B中的方法methodB,在同步调用时,class A中的方法methodA方法必须等到class B中的methodB方法执行完毕以后才能继续执行后面的语句,这会存在一个问题,如果methodB中方法执行时间需要很长,那么methodA需要一直等待,这显然很浪费时间。在实际工作中,你的老板吩咐你任务以后,显然不会等你完成以后再做别的工作,而是分配你任务以后,自己再去做别的事情,员工完成任务以后,主动去找老板汇报,这就是异步调用。
异步调用
异步调用指class A中方法methodA需要调用class B中的方法methodB时,可以新开一个线程,等待class B中的methodB中的方法执行任务,class A中的methodA方法可以继续执行后面的语句。这同样会存在一个问题,methodB方法执行完毕以后,class A中的methodA方法如何知道其已经执行完毕了?这就涉及到Java中的回调机制。
回调
回调有一句很fashion的话语,就像Spring中的好莱坞原则(Don't call me, I will call you),If you call me,I will call you back.在class A中methodA方法调用了classB中的方法methodB方法后,当methodB方法执行完毕以后,会自动调用classA中的方法,告知我已经执行完毕了。
例子
这里的例子很多,我这里就举一个老板与员工的例子。老板有一个任务需要分配给某一个员工去完成,当员工完成以后,员工告知老板(可以打老板的电话)任务已经完成。
1.回调函数接口
package com.honorzhang.callback;
public interface Callback {
//相当于是电话
public void finishedJob(String msg);
}
2.老板
package com.honorzhang.callback;
public class Boss implements Callback{
private Staff staff;
public Boss(Staff staff) {
this.staff = staff;
}
public void distributeTask() throws InterruptedException {
//新开一个线程,让员工去执行任务
new Thread(new Runnable() {
@Override
public void run() {
staff.solveProblem(Boss.this);
System.out.println(Thread.currentThread().getName());
}
}).start();
/*
* 接下来的三行代码主要是为了更好的看到代码执行的顺序情况
*/
System.out.println(Thread.currentThread().getName());
//sleep的时间可以自己设定,从而更好的理解代码的顺序执行情况
Thread.sleep(5000);
System.out.println("***我是分配任务后的老板要做的工作***");
}
@Override
//告知员工电话号码,任务完成以后,可以打这个电话号码告知任务完成
public void finishedJob(String msg) {
System.out.println(msg);
}
}
3.员工
package com.honorzhang.callback;
public class Staff {
public void solveProblem(Callback callback) {
//模拟员工解决问题
try {
System.out.println("正在解决问题...");
Thread.sleep(3000);
} catch (Exception e) {
System.out.println(e);
}
callback.finishedJob("报告老板,问题已经解决");
}
}
4.测试程序
package com.honorzhang.callback;
public class CallbackTest {
public static void main(String[] args) throws InterruptedException {
Staff staff = new Staff();
Boss boss = new Boss(staff);
boss.distributeTask();
}
}
5.执行结果
1.Boss代码块sleep时间设置为2s,执行结果如下:
2.Boss代码块sleep时间设置为5s,执行结果如下:
以上是我对Java回调函数的理解,有不对的地方还请多多指教。