异步调用:
类A的一个方法methodA()开启了一个新的线程调用了类B的方法methodB(),程序继续执行。无论methodB()执行多久都不会阻塞methodA()。如果想要methodB()方法的执行结果 则可以用Future+Callable方式做到这一点。 还有一种方法也可以就是回调
回调:
思想:
methodA()里调用methodB()。 methodB()执行结束后 调用A的callable()方法
模拟场景:
老师问学生问题 学生思考之后回答
首先需要一个回调接口 Callback 学生接口Student 学生类fitch(继承student) 教师类Teacher(继承Callback)
Callback接口里是学生想要告诉老师的答案
public interface Callback {
void tellAnswer(int answer);
}
学生接口:解决老师问的问题
public interface Student {
void resolve(Callback callback);
}
老师类:
public class Teacher implements Callback{
private Student stu;
public Teacher(Student student){
this.stu=student;
}
/**
* 向学生提问
*/
public void Ask(){
stu.resolve(this);//注意这里传递的是this
}
/**
* 答案
*/
public void tellAnswer(int answer){
System.out.println("答案是"+answer);
}
}
名叫fitch的学生
public class fitch implements Student{
public void resolve(Callback callback) {
try{
//学生的解题思路
}catch(Exception e){
}
//回调 告诉老师作业写了多久
callback.tellAnswer(3);
}
}
测试:
public class CallbackTest {
public static void main(String[] args){
Student stu=new fitch();
Teacher te=new Teacher(stu);
te.Ask();
}
}
结果:
答案是3
可以看出 老师调用学生的resolve()方法向学生提问,而学生解决问题后 调用老师的回调方法tellAnswer()
这叫双向调用
回调的核心是调用方(老师) 将自身 (this)传递给 被调用方(学生)