[Java]回撥機制
阿新 • • 發佈:2018-12-24
現有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()方法,實現遞迴。