1. 程式人生 > >[Java]回撥機制

[Java]回撥機制

現有A、B兩個類,兩個類的例項a、b,A中實現a()方法,B中實現b()方法。

回撥要求物件a在呼叫b物件的b()方法時,b()方法返回前需呼叫物件a的a()方法。

以管道通訊傳輸為例,程式需要一邊不停接收對端傳來的資料並將接收到的資料進行處理,而又不影響主執行緒的進行。

 假定現有2個介面:接收者,處理者

interface 接收者{
    abstract void 不停接收(處理者 handler);
}
interface 處理者{
    abstract void 資料處理(資料 info);
}

假定有2個實現了介面的類:我會接收、我會處理

class 我會接收 implements 接收者{

    //實現介面中的抽象方法
    public void 不停接收(處理者 handler){
        //新建執行緒用於不停接收資料
        new Thread(){
            //一個實現了的接收方法 接收(),將管道中的資料拿出並返回
            //若無資料將阻塞在此,等待資料
            資料 info = 接收();
            //資料接收完畢,呼叫handler物件的資料處理()方法
            handler.資料處理(info);
        }.start()
    }
}
class 我會處理 implements 處理者{
    
    //實現介面中的抽象方法
    public void 處理資料(資料 info){
        //將資料處理簡化為輸出資料
        System.out.println(info);
    }
    
    public void 開始處理(接收者 receiver){
        receiver.不停接收(this);
    }
}

在主執行緒中接收並處理資料:

public class Demo{
    public static void manin(String[] args){
        我會處理 handler = new 我會處理();
        我會接收 receiver = new 我會接收();
        handler.開始處理(receiver);
        //資料開始接收後,主程式繼續循序執行程式碼
        System.out.println("回撥機制正在進行...");
    }
}

上述程式碼中:

“我會接收”類為A類,handler為該類(我會接收)的一個例項看做a;

“我會處理”類為B類,receiver為該類的一個例項看做b;

“資料處理”看做A類中的a()方法;

“不停接收”看做B類中的b()方法。

物件a呼叫物件b的b()方法,b()方法迴圈呼叫a物件的a()方法,實現遞迴。