Java——回撥機制
呼叫方式
同步呼叫:類A的方法a()呼叫類B的方法b(),一直等待b()方法執行完畢,a()方法繼續往下走。這種呼叫方式適用於方法b()執行時間不長的情況,因為b()方法執行時間一長或者直接阻塞的話,a()方法的餘下程式碼是無法執行下去的,這樣會造成整個流程的阻塞。
非同步呼叫:類A的方法方法a()通過新起執行緒的方式呼叫類B的方法b(),程式碼接著直接往下執行。
回撥:包括同步回撥和非同步回撥。
- 類A的a()方法呼叫類B的b()方法
- 類B的b()方法執行完畢主動呼叫類A的callback()方法
經典回撥方式
Class A實現介面CallBack callback——背景1
class A中包含一個class B的引用b ——背景2
class B有一個引數為callback的方法f(CallBack callback) ——背景3
A的物件a呼叫B的方法 f(CallBack callback) ——A類呼叫B類的某個方法 C
然後b就可以在f(CallBack callback)方法中呼叫A的方法 ——B類呼叫A類的某個方法D
示例
以工人向老闆請假為例:
同步回撥:工人打電話向老闆請假,在電話中一直等待老闆回覆,老闆同意後,再答謝老闆。
非同步回撥:工人打電話向老闆請假,老闆在開會等會給答覆,然後工人掛掉電話幹別的事情並等待老闆的通知,老闆回電話同意請假,工人答謝老闆。
結構設計
Callback 介面中有 replyWorker() 答覆工人請假請求介面,也是老闆決定後需要回撥的方法。
Worker 類實現回撥介面,並持有 Boss 的引用,向 Boss 註冊監聽器,等待 Boss 的回覆。
Boss 類回撥 Worker 的方法來答覆 Worker 的請假。
程式碼實現
Callback 介面
interface Callback {
/**
* 答覆工人請假請求
*/
void replyWorker(String message);
}
Worker 類實現回撥介面,並持有 Boss 的引用,向 Boss 註冊監聽器,等待 Boss 的回覆
class Worker implements Callback {
private Boss boss;
public Worker(Boss boss){
this.boss = boss;
}
public void leave(){
System.out.println("請求批准請假兩天");
//同步回撥 (可以分別註釋掉同步和非同步回撥的程式碼,看執行效果)
boss.reply(this); //工人註冊監聽方法
System.out.println("同步阻塞等待老闆的答覆後,才能做別的事情");
//非同步回撥
new Thread(new Runnable() {
@Override
public void run() {
boss.reply(Worker.this);
}
}).start();
System.out.println("非同步非阻塞,做別的事情並等待老闆的回覆");
}
@Override
public void replyWorker(String message){
System.out.println("老闆回覆: " + message);
}
}
Boss 類回撥 Worker 的方法來答覆 Worker 的請假
class Boss {
public void reply(Callback callback){
try {
//老闆思考2s 後回覆
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
callback.replyWorker("同意請假");
}
}
測試程式碼
public class CallbackPattern {
public static void main(String[] args){
Boss boss = new Boss();
Worker worker = new Worker(boss);
worker.leave();
}
}
同步回撥執行結果
請求批准請假兩天
老闆回覆: 同意請假
同步阻塞等待老闆的答覆後,才能做別的事情
非同步回撥執行結果
請求批准請假兩天
非同步非阻塞,做別的事情並等待老闆的回覆
老闆回覆: 同意請假
應用
回撥是一種機制,很多語言裡都有不同的實現,觀察者模式也是回撥的一種具體實現。觀察者模式可以見我的 觀察者模式 文章。回撥機制的應用也很廣泛,例如說java.util.Collections.sort(List, Comparator),這個sort()方法就定義了一個流程實現排序,而具體的順序則由傳入的Comparator引數來確定——這就是一個同步回撥。又例如說GUI程式設計中,一個按鈕被點選之後要做點事情,大家可以註冊個ActionListener上去監聽點選事件,在點選時被呼叫,這就是一個非同步回撥。
總結
回撥的核心就是回撥方將自身的引用傳遞給呼叫方,這樣呼叫方就可以在呼叫完畢之後告訴回撥方它想要知道的資訊。本文主要是我的思考和總結。
相關文章
- java回撥函式機制Java函式
- 夯實Java基礎系列11:深入理解Java中的回撥機制Java
- 1.3 - Laravel 5.6 - Callbacks 回撥函式機制Laravel函式
- 一個Demo帶你理解Android介面回撥機制Android
- java回撥函式-非同步回撥-簡明講解Java函式非同步
- java 回撥函式示例Java函式
- java閉包和回撥淺析Java
- [JS]回撥函式和回撥地獄JS函式
- 【JavaSE】java實現閉包與回撥Java
- 回撥方法
- java高階用法之:JNA中的回撥Java
- Java_介面回撥與匿名內部類Java
- Activity生命週期回撥是如何被回撥的?
- C++回撥C++
- js 回撥 callbackJS
- 回撥函式函式
- 回撥地獄
- 非同步/回撥非同步
- 用匿名內部類實現 Java 同步回撥Java
- 回撥函式(CallBack)函式
- 微博回撥介面
- JavaScript回撥函式JavaScript函式
- JavaScript 回撥函式JavaScript函式
- JS—回撥函式JS函式
- BLE從機(16)廣播與連線回撥
- 【詳細、開箱即用】.NET企業微信回撥配置(資料回撥URL和指令回撥URL驗證)
- 函式回撥(C++)函式C++
- 回撥函式的作用函式
- Python/OpenCV:回撥函式PythonOpenCV函式
- TLS回撥函式(Note)TLS函式
- 如何避免回撥地獄
- C++屌屌的觀察者模式-同步回撥和非同步回撥C++模式非同步
- Java反射機制Java反射
- Java包機制Java
- C# 同步 非同步 回撥 狀態機 async await DemoC#非同步AI
- Windows核心驅動-程序回撥Windows
- 回撥和spring的LambdaSafe類Spring
- JS之回撥函式(callback)JS函式
- C++回撥函式 用法C++函式