異步調用:
類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)傳遞給 被調用方(學生)