久久96国产精品久久久-久久发布国产伦子伦精品-久久精品国产精品青草-久久天天躁夜夜躁狠狠85麻豆

技術員聯盟提供win764位系統下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務器類 >

Java談回調函數詳解

來源:技術員聯盟┆發布時間:2017-09-16 00:21┆點擊:

  正題,談回調函數 (Callback)

  解釋(引用于百度百科):

  回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所

  指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調

  用的,用于對該事件或條件進行響應。

  機制(引用于百度百科):

  ⑴定義一個回調函數;

  ⑵提供函數實現的一方在初始化的時候,將回調函數的函數指針注冊給調用者;

  ⑶當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理。

  意義(個人理解):

  調用者和被調用者的關系簡單化,互相不用關心對方的邏輯處理,不用關系對方都程序是怎么的,只關系返回值,這種基于返回值

  的機制很好地使兩者的關系簡單,明了。

  上代碼,以下講述阿 Ben 去飯堂吃飯的故事

  接口 Callback

  接口定義事情 Done 了之后應該做些什么

  public interface Callback {

  public void Done(String str);

  }

  Ben 類

  阿 Ben 餓了,于是要去 have lunch,他叫了 Aunt 幫他煮個飯,調用 Aunt 的 cookMeal 方法,于是 Aunt 就去煮了,至于怎么煮,Ben 就不用管了,只要煮好了,就調用 Done,給飯阿 Ben 吃就可以了。

  public class Ben implements Callback {

  public void havelunch(Aunt aunt){

  aunt.cookMeal(this);

  }

  @Override

  public void Done(String str) {

  System.out.println(str);

  }

  }

  Aunt 類

  賦值給 str 就是煮飯的過程,煮好之后,就把結果(飯菜)返回給主函數(Ben)。

  public class Aunt {

  String str;

  public void cookMeal(Callback callback){

  str=" 香噴噴的飯菜來咯 "; // 這個就是煮飯的過程

  callback.Done(str);

  }

  }

  測試類

  public class test {

  /**

  * @param args

  */

  public static void main(String[] args) {

  Aunt class2=new Aunt();

  Ben class1=new Ben();

  class1.havelunch(class2);

  }

  }

  結果:

Java談回調函數詳解 三聯

  剛才阿姨在煮飯的時候,阿 Ben 是傻乎乎地站在那里等,等同于是在陪阿姨做飯,這個就是同步回調。

  時間怎么可以這么浪費的呢。下面來看看異步回調。

  異步回調

  這個時候,阿姨還是規規矩矩地做飯。而啊 Ben,得同時做點事情。所以只需要修改 Ben 類。

  public class Ben implements Callback {

  public void havelunch(final Aunt aunt){

  new Thread(new Runnable() { //new 一個新的線程去做這個事情,并等待返回結果

  @Override

  public void run() {

  aunt.cookMeal(Ben.this);

  }

  }).start();

  play(); // 在阿姨做飯的時候可以玩一會手機先嘛。就不用傻傻地等了,阿姨煮好飯會喊吃的了。

  }

  public void play(){

  System.out.println(" 玩手機,刷微博,朋友圈,聊扣扣 ");

  }

  @Override

  public void Done(String str) {

  System.out.println(str);

  }

  }

  結果:

Java談回調函數詳解

  總結:

  回調函數就是那么一回事。

  今天在一篇 nodejs 的文章看到了一句話是這么說的:

  在代碼中,異步編程的直接體現就是回調。異步編程依托于回調來實現,但不能說使用了回調后程序就異步化了。

  說的不就是這個道理么。呵呵。