Java 回調函數詳解及使用

Java 回調函數詳解html

前言:java

C語言中回調函數解釋:程序員

回調函數(Callback Function)是怎樣一種函數呢?
函數是用來被調用的,咱們調用函數的方法有兩種:ajax

         直接調用:在函數A的函數體裏經過書寫函數B的函數名來調用之,使內存中對應函數B的代碼得以執行。這裏,A稱爲「主叫函數」(Caller),B稱爲「被叫函數」(Callee)。算法

         間接調用:在函數A的函數體裏並不出現函數B的函數名,而是使用指向函數B的函數指針p來使內存中屬於函數B的代碼片段得以執行——聽起來很酷,是吧。spring

比起直接調用來,間接調用的確麻煩,那爲何還要使用間接調用呢?緣由很簡單——直接調用把函數名都寫進函數體了,通過編譯器那麼一編譯,板上釘釘,A註定調用的是B了,這樣的程序只能按照程序員事先設計好的流程執行下去,太呆板了。此時,間接調用的巨大靈活性就顯現出來了。想想,若是p是函數A的一個參數(參數是變量,是變量就能夠變嗎!),那麼程序的最終用戶徹底能夠經過操做來改變p的指向——這樣,A在經過p調用函數的時候就有機會調用到不一樣的函數,這樣程序的實用性和擴展性就強多了。編程

   在WINDOWS中,程序員想讓系統DLL調用本身編寫的一個方法,因而利用DLL當中回調函數(CALLBACK)的接口來編寫程序,使它調用,這個就稱爲回調。在調用接口時,須要嚴格的按照定義的參數和方法調用,而且須要處理函數的異步,不然會致使程序的崩潰。這樣的解釋彷佛仍是比較難懂,這裏舉個簡單的例子,程序員A寫了一段程序(程序a),其中預留有回調函數接口,並封裝好了該程序。程序員B要讓a調用本身的程序b中的一個方法,因而,他經過a中的接口回調本身b中的方法。目的達到。在C/C++中,要用回調函數,被掉函數須要告訴調用者本身的指針地址,但在JAVA中沒有指針,怎麼辦?咱們能夠經過接口(interface)來實現定義回調函數。服務器

  正常狀況下開發人員使用已經定義好的API,這個過程叫Call。可是有時這樣不能知足需求,就須要程序員註冊本身的程序,而後讓事先定義好多API在合適的時候調用註冊的方法,這叫CallBack。數據結構

「一般你們說的回調函數通常就是按照別人(李四)的定好的接口規範寫,等待別人(張三)調用的函數,在C語言中,回調函數一般經過函數指針來傳遞;在Java中,一般就是編寫另一個類或類庫的人(李四)規定一個接口,而後你(張三)來實現這個接口,而後把這個實現類的一個對象做爲參數傳給別人的程序,別人的程序必要時就會經過那個接口來調用你編寫的函數。」架構

    使用技巧:定一個接口,在接口中聲明咱們想調用的方法。

                    在另外一個方法中註冊剛定義的回調接口

第一步:定義回調接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.callback;
  
/**
  *
  @since 2012-02-02
  *
  @desc 定義回調接口
  */
public interface CallBackInterface
  {
  
   public void doSome();
    
   public void exectueMethod();
}

第二步:李四編寫的程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
   }
}

  第三步:張三實現李四規定的接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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( "" );
     }
   }
}

  輸出結果:

?
1
2
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都用到回調機制,能夠訪問遠程服務器程序。

下面舉個通俗的例子: 

某天,我打電話向你請教問題,固然是個難題,:),你一時想不出解決方法,我又不能拿着電話在那裏傻等,因而咱們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,個人手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了「異步+回調」的編程模式。其中,你後來打手機告訴我結果即是一個「回調」過程;個人手機號碼必須在之前告訴你,這即是註冊回調函數;個人手機號碼應該有效而且手機可以接收到你的呼叫,這是回調函數必須符合接口規範。 
經過上面我的感受到回調函數更多的應用就是結合異步。好比:ajax中jServer經過組件和服務器的異步通訊。

什麼是回調函數

精妙比喻:回調函數還真有點像您隨身帶的BP機:告訴別人號碼,在它有事情時Call您 

回調用於層間協做,上層將本層函數安裝在下層,這個函數就是回調,而下層在必定條件下觸發回調,例如做爲一個驅動,是一個底層,他在收到一個數據時,除了完成本層的處理工做外,還將進行回調,將這個數據交給上層應用層來作進一步處理,這在分層的數據通訊中很廣泛。 

其實回調和API很是接近,他們的共性都是跨層調用的函數。但區別是API是低層提供給高層的調用,通常這個函數對高層都是已知的;而回調正好相反,他是高層提供給底層的調用,對於低層他是未知的,必須由高層進行安裝,這個安裝函數其實就是一個低層提供的API,安裝後低層不知道這個回調的名字,但它經過一個函數指針來保存這個回調,在須要調用時,只需引用這個函數指針和相關的參數指針。

其實:回調就是該函數寫在高層,低層經過一個函數指針保存這個函數,在某個事件的觸發下,低層經過該函數指針調用高層那個函數。

 

 

 
Java架構師必備高可用架構設計與實踐附ppt 16周
2017年最新JAVASE基礎視頻教程 11課 附課件、代碼、練習
2017年最新JAVA面向對象精講視頻教程 22課 附課件、代碼、練習
2017年最新JAVA編程基礎精講視頻教程 15課 附課件、代碼、練習
大神班JAVA第一期教程+課件(時下火的2016年java P2P金融項目)
2017年最新整理java消息機制技能突破視頻教程全套
Java從入門到精通(第4版)光盤內容
【理論基礎】基於Java的數據結構與算法附源碼 20課
Mina2.0教程三合一(中文參考手冊pdf、快速入門與源碼剖析pdf、實例學習筆記) attach_img
java Spring團購完整先後臺進階
史上最全Spring之11套開發視頻教程下載
史上最全STRUTS之10套開發視頻教程下載
2016 老男孩大數據雲計算高級架構師11期
孫鑫老師JAVA無難事視頻教程 最適合java入門學習打基礎的課程 附源碼講義 12課
全網首部:Netty源碼剖析&NIO+Netty5各類RPC架構實戰演練 attach_img
【基礎入門】即學即會的Java程序設計基礎視頻教程 attach_img
springMVC視頻教程李守紅
Netty5快速入門及實例視頻教程(視頻+源碼+筆記)
傳智播客2014上海java培訓基礎+就業班 主流框架 項目實戰
傳智播客JAVAEE SSH 成都 基礎班+就業班 附多個項目實戰
相關文章
相關標籤/搜索