Java中的回调机制

    xiaoxiao2021-03-25  105

    一、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); } }

    得到结果:

    转载请注明原文地址: https://ju.6miu.com/read-6274.html

    最新回复(0)