天天看點

Java回調函數執行個體

回調函數簡單點說就是:A調用B中的方法,B方法執行結束後,再調用A中的方法,而該方法就是回調函數。

下面舉個例子,該例子的主要思想是:A打電話給B,叫B幫忙買東西,B會給A回電話東西是否買到了。

接口類:Callback.java

package lifeixu.com.callback;

public interface Callback {
    //回調函數,A調用B的方法,B開始執行,B執行結束後,調用A的方法,是以該方法由A來實作
    public void bCALLa(String result);
}
           

A.java

public class A implements Callback {

    private B b;

    public A(B li) {
        this.b = li;
    }
    //A打電話叫B幫忙買東西
    public void buyByCall(String something) {
        System.out.println("A--->A要買的東西是: "+something);

        new Thread(new Runnable(){
            @Override
            public void run() {
                //***1.A調用B的函數,将A要買的東西傳給B,并注冊回調函數
                b.buySomething(A.this, something);
            }
        }).start();

        play();
    }

    public void play() {
        System.out.println("A--->A邊看電視邊等B電話");
    }

    @Override
    public void bCALLa(String result) {
        System.out.println("A--->A等到B的電話,結果是:"+result);
    }

}
           

B.java

public class B {
    private String result = "東西沒有買到";

    public void buySomething(Callback callback, String something) {
        //***2.B執行自己的方法
        result = shoping(something);

        //***3.等待B執行結束後,B調用A的函數,B打電話給A東西買好了
        callback.bCALLa(result);
    }

    public String shoping(String something){
        System.out.println("B--->B要幫A買的東西是:"+something);
        System.out.println("B--->B開始幫A買:"+something);
        //模拟B買東西,花費一定的時間
        for(int i=;i<;i++) {

        }
        System.out.println("B--->B幫A買好了:"+something);

        result = something+"買到了";
        return result;
    }
}
           

測試類:Test.java

public class Test {
    public static void main(String[] args) {
        testAB();
    }

    public static void testAB() {
        B b = new B();
        A a = new A(b);

        a.buyByCall("蘋果");
    }
}
           

測試結果:

A--->A要買的東西是: 蘋果
A--->A邊看電視邊等B電話
B--->B要幫A買的東西是:蘋果
B--->B開始幫A買:蘋果
B--->B幫A買好了:蘋果
A--->A等到B的電話,結果是:蘋果買到了
           

再附加個簡單的callback例子:

接口類:CallbackInterface.java

public interface CallbackInterface {
    public void callback();
}
           

MethodTime.java

public class MethodTime {
    private CallbackInterface callbackInterface;

    public MethodTime(CallbackInterface callbackInterface) {
        this.callbackInterface = callbackInterface;
    }

    public void methodTime() {
        long start = System.currentTimeMillis();
        System.out.println("start time: " + start);
        callbackInterface.callback();//需要計算時間的方法
        long end = System.currentTimeMillis();
        System.out.println("end time: " + end);
        System.out.println("use time: " + (end - start));
    }
}
           

測試類:Test.java

public class Test {
    public static void main(String[] args) {
        testMethodTime();
    }

    public static void testMethodTime() {
        MethodTime mt = new MethodTime(new CallbackInterface() {
            @Override
            public void callback() {
                for(int i=;i<;i++) {

                }
            }
        });

        mt.methodTime();
    }
}