一、Java中的回调机制
个人的大致理解:设有两个类A与B,A继承了接口CallBack,并实现了CallBack中的抽象方法x(),在类A中拥有类B的对象b,即在A中通过对象b对类B中的方法进行调用,B中含有A的对象a,在类B中对类A实现的方法x()进行调用。
概念很枯燥并且很是绕口,还是举个栗子进行讲解吧。
1、假设在一场战争中,士兵既负责放哨又负责开火,但士兵不知道开火的具体坐标,所以每当士兵发现敌人,就会报告给指挥官,指挥官进行位置的计算,计算完毕后发送消息位置给士兵,士兵得到坐标进行开火。
2、但士兵有自己的职责,也就是放哨,所以士兵发送报告后,一直处于等待状态,直到长官发送消息后开火再履行放哨的职责即为同步回调。如果士兵发送报告后继续放哨,直到收到消息后开火即为异步回调。
我们先来看异步回调
回调接口的定义:
package callback;
/*
*进行回调接口的创建
*/
interface CallBack {
public void fire(int location) ;
}
士兵类的定义:
package callback;
public class Soldier implements CallBack{
private Commander com ;
public Soldier(){
}
public void setCommander(Commander com){
this.com = com ;
}
public void askLocation(){
//创建异步线程
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
com.findLocation(Soldier.this);
}
}).start();
System.out.println("Keep watching !");
}
@Override
public void fire(int location) {
// TODO Auto-generated method stub
System.out.println("Fire " + location);
}
}
长官的定义:
package callback;
public class Commander {
public Commander(){
}
/*
* 寻找开火位置
*/
public void findLocation(CallBack soldier){
//寻找事件
for(int i = 0 ; i < 10 ; i++){
System.out.println("I am stilling counting ! ");
}
//模拟计算事件5秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//完毕之后通知士兵开火
soldier.fire(0);
}
}
主函数进行测试:
package callback;
public class TestCallBack {
/*
* 进行回调的测试
*/
public static void main(String[] args){
//创建士兵对象
Soldier soldier = new Soldier() ;
//创建长官对象
Commander commander = new Commander() ;
//设置长官
soldier.setCommander(commander);
//进行方法的调用
soldier.askLocation();
}
}
得到结果:
同步回调机制除士兵类稍有差别,其它保持一致:
package callback;
public class Soldier implements CallBack{
private Commander com ;
public Soldier(){
}
public void setCommander(Commander com){
this.com = com ;
}
public void askLocation(){
com.findLocation(Soldier.this);
System.out.println("Keep watching !");
}
@Override
public void fire(int location) {
// TODO Auto-generated method stub
System.out.println("Fire " + location);
}
}
得到结果: