zoukankan      html  css  js  c++  java
  • java中的回调机制的理解(小例子)

    这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。

      正常情况下开发人员使用已经定义好的API,这个过程叫Call。但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让事先定义好多API在合适的时候调用注册的方法,这叫CallBack。

    “通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递;在Java中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。

        使用技巧:定一个接口,在接口中声明我们想调用的方法。

                        在另一个方法中注册刚定义的回调接口

    第一步:定义回调接口
    
    
    package com.callback;
     
    /**
     * @since 2012-02-02
     * @desc 定义回调接口
     */
    public interface CallBackInterface {
     
        public void doSome(); 
         
        public void exectueMethod();
    }
    
    
    第二步:李四编写的程序
    package com.callback;
     
    /**
     * @since 2012-02-02
     * @desc 李四
     */
    public class MethodB {
     
        public double getTime(CallBackInterface callBack) {
            long start = System.currentTimeMillis();
            callBack.exectueMethod();
            long end = System.currentTimeMillis();
            System.out.println("cost time=" + (end - start));
            return end - start;
        }
    }

      第三步:张三实现李四规定的接口

    package com.callback;
     
    /**
     * @since 2012-02-02
     * @desc 张三
     */
    public class MethodA {
     
        public static void main(String args[]){
            MethodB b=new MethodB();
            //返回值d只和MethodB有关,和接口中方法的返回值无关
            double d=b.getTime(new CallBackInterface() {
                 
                //张三实现了李四定义的接口
                public void exectueMethod() {
                    new MethodA().testMethod();
                }
                 
                @Override
                public void doSome() {
                     
                }
            });
            System.out.println("d="+d);
        }
         
        public void testMethod(){
            for(int i=0;i<10000;i++){
                System.out.print("");
            }
        }
    }

      输出结果:

    cost time=31
    d=31.0

    理解“回调函数” 

    所谓回调,就是客户程序CLIENT调用服务程序SERVER中的某个函数SA,然后SERVER又在某个时候反过来调用CLIENT中的某个函数CB,对于CLIENT来说,这个CB便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。 
    一般说来,CLIENT不会自己调用CB,CLIENT提供CB的目的就是让SERVER来调用它,而且是CLIENT不得不提供。由于SERVER并不知道CLIENT提供的CB叫甚名谁,所以SERVER会约定CB的接口规范(函数原型),然后由CLIENT提前通过SERVER的一个函数R告诉SERVER自己将要使用CB函数,这个过程称为回调函数的注册,R称为注册函数。Web SERVERerviCliente以及Java的RMI都用到回调机制,可以访问远程服务器程序。 
    自我的修养,从点滴做起。
  • 相关阅读:
    SD卡image 的文件系统分区太小无法安装更多库(如何扩大SD卡rootfs分区)
    ubuntu下生成dtb文件提示:sopc2dts: command not found
    HPS端用于信息打印窗口的 串口的驱动是什么时候加载的呢?
    给 HPS 增添了一个用FPGA逻辑自定义的外设以后, SD卡 image里面哪些文件要更新?
    为何FPGA 外设 IP 与 HPS IP 之间有个 Avalon-MM Pipeline Bridge IP?
    什么是根文件系统(root filesystem)(未完待续)
    为什么preloader和uboot要放置在RAW A2分区?
    重装系统的时候最好选择?(未完待续)
    Android相关知识点面试
    java知识查漏补缺
  • 原文地址:https://www.cnblogs.com/tshq/p/5689944.html
Copyright © 2011-2022 走看看