一、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); } }得到结果: