<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 閱讀(371) 評論(0)  編輯  收藏 所屬分類: Programing

    主站蜘蛛池模板: 日韩成人精品日本亚洲| 91福利免费体验区观看区| 亚洲精品~无码抽插| 色欲色香天天天综合网站免费| 亚洲日韩图片专区第1页| 成人无码区免费视频观看| 日本黄页网址在线看免费不卡| 亚洲国产精品人久久| 在线观看免费宅男视频| 中文字幕永久免费视频| 亚洲国产精品网站久久| 亚洲另类少妇17p| AV大片在线无码永久免费| 四虎一区二区成人免费影院网址| 久久亚洲精精品中文字幕| 国产jizzjizz视频免费看| 99精品免费观看| 深夜福利在线视频免费| 亚洲成a人片在线观看中文app| 亚洲成年人啊啊aa在线观看| 18勿入网站免费永久| 美女巨胸喷奶水视频www免费| 亚洲av永久综合在线观看尤物| 国产AⅤ无码专区亚洲AV| 成年女人看片免费视频播放器| 中文字幕无码一区二区免费| 在线看亚洲十八禁网站| 亚洲福利电影一区二区?| 自拍偷自拍亚洲精品情侣| 国内大片在线免费看| 亚洲美女视频免费| 三年片免费高清版| 黄页网址在线免费观看| 亚洲国产日韩在线一区| 亚洲AV综合色区无码另类小说 | 一区二区三区四区免费视频 | 中文字幕成人免费高清在线| 最新国产精品亚洲| 337p日本欧洲亚洲大胆艺术| 亚洲愉拍99热成人精品热久久| 日韩免费一级毛片|