参考理解详情看:https://my.oschina.net/u/3703858/blog/1798627,https://blog.csdn.net/hu_belif/article/details/80284140
回调函数:
- 你定义的
- 你没有调
- 但最终它执行了
模拟了一个打印机,还有一个人,打印机具有打印的功能,但是打印需要时间,不能在收到任务的同时给出反馈,需要等待一段时间才能给出反馈。这个人想做的就是打印一份简历,然后知道打印的结果。不是主动去看结果,而是被通知结果。
1.定义回调接口
public interface Callback {
public void printFinished(String msg);
}
2.人(称为回调函数)
public class People implements Callback {
private Printer printer;
public People(Printer printer) {
this.printer = printer;
}
@Override
public void printFinished(String msg) {
System.out.println("打印出的内容:" + msg);
}
public void startPrint() {
//异步回调
new Thread(new Runnable() {
public void run() {
//因为被当做参数传过去,所以People是回调函数
printer.print(People.this);
}
}).start();
/*
同步回调
printer.print(People.this);
*/
}
}
3.打印机
public class Printer {
public void print(Callback callback){
System.out.println("打印中......请等待");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
callback.printFinished("牛逼我打印出了");
}
}
4.测试
public class Test {
public static void main(String[] args) {
Printer printer=new Printer();
People people=new People(printer);
people.startPrint();
System.out.println("因为是异步回调,所以我不用等上面的方法执行完才可以打印,所以我先打印了");
//System.out.println("因为是同步回调,我得等上面的方法执行完才能打印");
}
}
结果:
异步回调结果
因为是异步回调,所以我不用等上面的方法执行完才可以打印,所以我先打印了
打印中......请等待
打印出的内容:牛逼我打印出了
同步回调结果:要测试同步,把注释去掉,把异步回调和打印语句注释上
打印中......请等待
打印出的内容:牛逼我打印出了
因为是同步回调,我得等上面的方法执行完才能打印
回调就是下图这样
People类注入Printer类,程序执行从startPrint()开始,然后调用Printer.print(),print()里会调用printFinished(),然后就执行printFinished()里的方法。
实现异步回调就是多线程,新建线程写在回调方/被回调方都行
可以改成如下
public class People implements Callback {
private Printer printer;
public People(Printer printer) {
this.printer = printer;
}
@Override
public void printFinished(String msg) {
System.out.println("打印出的内容:" + msg);
}
public void startPrint() {
printer.print(People.this);
}
}
public class Printer {
public void print(Callback callback) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("打印中......请等待");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
callback.printFinished("牛逼我打印出了");
}
}).start();
}
}