java回調(diào)機制

回調(diào)的基本概念

在java中,我們可以將回調(diào)簡單理解為:類A中的a方法調(diào)用類B中的b方法,而類B的b方法有反過來調(diào)用類A中的回調(diào)方法(callBack())。

image

回調(diào)還可以分為同步回調(diào)異步回調(diào)

同步回調(diào)

先看下面例子:

代碼清單1:ICallBack.java

/**
 * 回調(diào)接口
 * @author 葉漢偉
 * @version v1.0
 */
public interface ICallBack {
    public void callBack();
}

代碼清單2:A.java

/**
 * 類A,繼承并實現(xiàn)接口ICallBack
 * @author 葉漢偉
 * @version v1.0
 */
public class A implements ICallBack{
    public void afunc(B b){
        System.out.println("A調(diào)用B的函數(shù)...");
        b.bfunc(this);
    }
    
    @Override
    public void callBack(){
        System.out.println("執(zhí)行A的回調(diào)函數(shù)");
    }
}

代碼清單3:B.java

/**
 * 類B,調(diào)用類A的回調(diào)方法
 * @author 葉漢偉
 *@version v1.0
 */
public class B {
    public void bfunc(ICallBack _callBack){
        System.out.println("B調(diào)用A的“回調(diào)函數(shù)”");
        _callBack.callBack();
    }
}

代碼清單4:Test.java

public class Test {
    public static void main(String[] args){
        A _a=new A();
        B _b=new B();
    
        _a.afunc(_b);
    }
}

運行結(jié)果:

A調(diào)用B的函數(shù)... </br>
B調(diào)用A的“回調(diào)函數(shù)”...</br>
執(zhí)行A的回調(diào)函數(shù)...

回調(diào)結(jié)束!

根據(jù)以上例子分析,同步回調(diào)是執(zhí)行A的afunc()函數(shù),到調(diào)用B的bfunc()函數(shù)執(zhí)行回調(diào),直到回調(diào)結(jié)束后程序再返回afunc()函數(shù)繼續(xù)執(zhí)行。

image

可見同步回調(diào)是一種順序的,阻塞的程序調(diào)用,若回調(diào)函數(shù)的處理需要的時間久一點,就會造成程序無法繼續(xù)向下執(zhí)行,降低應(yīng)用的整體性能。

異步回調(diào)

保持ICallBack.java和Test.java不變,重構(gòu)A.java和B.java,將同步回調(diào)改成異步回調(diào)。代碼如下:

代碼清單5:A.java

/**
 * 類A,繼承并實現(xiàn)接口ICallBack
 * @author 葉漢偉
 * @version v2.0
 */
public class A implements ICallBack{
    public void afunc(B b){
        System.out.println("A調(diào)用B的函數(shù)...");
        
         new Thread(new Runnable() {  
    @Override  
    public void run() {  
        b.bfunc(A.this);   
    }  
    }).start();  
         
        System.out.println("afunc()函數(shù)執(zhí)行完畢!");
    }
    
    @Override
    public void callBack(){
        System.out.println("執(zhí)行A的回調(diào)函數(shù)...");
    }
}

代碼清單6:B.java

/**
 * 類B,調(diào)用類A的回調(diào)方法
 * @author 葉漢偉
 *@version v2.0
 */
public class B {
    public void bfunc(A a){
        System.out.println("B調(diào)用A的“回調(diào)函數(shù)”...");
         try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {}

        a.callBack();
        System.out.println("回調(diào)結(jié)束!");
    }
}

運行結(jié)果:

A調(diào)用B的函數(shù)...

afunc()函數(shù)執(zhí)行完畢!

B調(diào)用A的“回調(diào)函數(shù)”...

執(zhí)行A的回調(diào)函數(shù)...

回調(diào)結(jié)束!

可見,異步回調(diào)中,程序不會等回調(diào)執(zhí)行完后再繼續(xù)執(zhí)行剩余程序,而是另起線程,一邊繼續(xù)執(zhí)行剩余程序,一邊執(zhí)行回調(diào)程序,等回調(diào)執(zhí)行完后返回結(jié)果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自Java回調(diào)機制解析 模塊之間總是存在這一定的接口,從調(diào)用方式上看,可以分為三類:同步調(diào)用、回調(diào)和異步調(diào)用。...
    抓兔子的貓閱讀 702評論 0 8
  • 前言 Java 回調(diào)學(xué)習(xí)文章 這個是目前講回調(diào)講的最好的一片文章, 三點建議: 其中使用了內(nèi)部類,不用也是可以的,...
    張家小2閱讀 738評論 0 0
  • 曾經(jīng)自己偶爾聽說過回調(diào)機制,隱隱約約能夠懂一些意思,但是當讓自己寫一個簡單的示例程序時,自己就傻眼了。隨著工作經(jīng)驗...
    zhglance閱讀 6,976評論 5 4
  • ??前段時間高曉松的一句“生活不只是眼前的茍且,還有詩和遠方的田野”充斥著朋友圈,激起了無數(shù)寶寶們的詩意情感,整個...
    carry生活閱讀 836評論 0 0
  • 你們有沒有這樣的時候,很多事你很想嘗試但又猶豫不前。好的結(jié)果是如果思想一下想通,可能壯著膽子就做了;壞的結(jié)果就是你...
    a8279cbde692閱讀 613評論 9 13

友情鏈接更多精彩內(nèi)容