<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    統計

    留言簿(1)

    DB

    Others

    QA

    Tech Website

    閱讀排行榜

    評論排行榜

    回調機制

    一、基本概念
    軟件模塊之間總是存在著一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。
    同步調用是一種阻塞式調用,調用方要等待對方執行完畢才返回,它是一種單向調用,如HTTP;
    回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;
    異步調用是一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口),如JMS;
    回調和異步調用的關系非常緊密,通常我們使用回調來實現異步消息的注冊,通過異步調用來實現消息的通知。同步調用是三者當中最簡單的,而回調又常常是異步調用的基礎。



    二、基本實現
    在C語言中,如果參數是一個函數指針,調用者可以傳遞一個函數的地址給實現者,讓實現者去調用它,這稱為回調函數。

    #include <stdio.h>
    #include 
    <stdlib.h>

    typedef 
    void (*callback_t) (void *);
    void repeat_three_times(callback_t, void *);
    void say_hello(void *str);
    void count_numbers(void * num);
    main()
    {
          repeat_three_times(say_hello,
    "guys");
          repeat_three_times(count_numbers, (
    void*4);
          system(
    "pause");
    }


    void repeat_three_times(callback_t f, void *para){
         f(para);
         f(para);
         f(para);
         }

    void say_hello(void *str){
         printf(
    "hello %s\n", (const char*)str);
         }

    void count_numbers(void * num){
         
    int i ;
         
    for(i = 1; i <= (int)num; i++)
               printf(
    "%d ", i);
         putchar(
    '\n');
         }


    在面向對象的語言中(以Java為例),主要利用多態來實現回調,其原理和觀察者模式相似,被調函數首先要在調用者身上注冊,當某一事件觸發時,回調函數被觸發;有個很形象的說法:我去找你解決一個問題,但你目前也不知道如何解決,要研究一會,我就把我的聯系方式告訴你,你解決問題后主動告訴我吧。這就是一個異步的回調,我省去了一直等待這個過程,我可以利用這些時間去處理別的事情。

    一個詳細的代碼例子:
    2011年4月29日
    package callback;

    public interface ICallback {
        
    public void execute();
    }



    package callback;

    public class CallWithCallback implements ICallback{

        
    public CallWithCallback(){}
        
        
    public void execute() {
            System.out.println(
    "execute callback function..");
        }


    }


    package callback;

    public class Caller {
        
        
    private ICallback callback;
        
    public void setCallback(ICallback callback) {
            
    this.callback = callback;
        }

        
        
    public Caller(){}
        
        
    public void doCallback(){
            
    this.callback.execute();
        }

        
    }


    package callback;

    public class CallerDriveMain {

        
    public static void main(String[] args) {
            Caller caller 
    = new Caller();
            caller.setCallback(
    new CallWithCallback());  //注冊
            caller.doCallback();  //調用

        }


    }


    三、參考資料
    1)異步消息的傳遞-回調機制
    2)C語言回調函數

    posted on 2011-04-29 22:36 XXXXXX 閱讀(366) 評論(0)  編輯  收藏 所屬分類: Programing

    主站蜘蛛池模板: 男女一边桶一边摸一边脱视频免费 | 在线A级毛片无码免费真人| 免费99精品国产自在现线| 国产A在亚洲线播放| 国产午夜无码片免费| 亚洲精品无码久久一线| 在线观看免费无码专区| 亚洲伦另类中文字幕| 一级女人18毛片免费| 中文字幕在线观看亚洲日韩| 午夜色a大片在线观看免费| 亚洲日韩国产欧美一区二区三区 | 一级成人生活片免费看| 亚洲日韩精品一区二区三区| 亚洲一级毛片在线播放| 久久久久免费看黄A片APP| 亚洲av无码一区二区三区四区| 国产最新凸凹视频免费| 一级一片免费视频播放| 亚洲av日韩av无码| 无码人妻精品中文字幕免费东京热| 国内精品久久久久影院亚洲| 亚洲成a人无码av波多野按摩| 高清永久免费观看| 亚洲综合激情另类小说区| 99精品全国免费观看视频| 黄色免费在线观看网址| 国产V亚洲V天堂A无码| 国产成人无码免费看视频软件| 亚洲日韩在线中文字幕综合| 国产亚洲精久久久久久无码77777| 最近免费最新高清中文字幕韩国| 亚洲人成色4444在线观看| 国产午夜亚洲不卡| 成年黄网站色大免费全看| 色屁屁在线观看视频免费| 亚洲Av无码专区国产乱码DVD| 两性刺激生活片免费视频 | 久久久精品国产亚洲成人满18免费网站| 久久噜噜噜久久亚洲va久| 在线视频免费国产成人|