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回撥機制解讀Java
- Java 回撥機制(CallBack) 趣解Java
- Java介面回撥機制詳解Java
- 深入淺出Java回撥機制Java
- 深入淺出: Java回撥機制(非同步)Java非同步
- Java 非同步回撥機制例項解析Java非同步
- 回撥機制詳解
- 1.3 - Laravel 5.6 - Callbacks 回撥函式機制Laravel函式
- 夯實Java基礎系列11:深入理解Java中的回撥機制Java
- java介面回撥Java
- jni回撥java方法Java
- Java--回撥模型Java模型
- java回撥函式Java函式
- 一個Demo帶你理解Android介面回撥機制Android
- java回撥函式-非同步回撥-簡明講解Java函式非同步
- java 介面回撥經典案例--網路請求回撥Java
- java 回撥函式示例Java函式
- 當觀察者模式和回撥機制遇上Android原始碼模式Android原始碼
- C++中實現回撥機制的幾種方式[轉]C++
- Java回撥函式的理解Java函式
- 淺析回撥機制,這是一篇騷騷的文章
- java閉包和回撥淺析Java
- 回撥函式透徹理解Java函式Java
- 用 Java 實現回撥例程 (轉)Java
- [JS]回撥函式和回撥地獄JS函式
- 【JavaSE】java實現閉包與回撥Java
- Java中的閉包(Closure)和回撥Java
- php 使用Callable Closure強制指定回撥型別PHP型別
- Activity生命週期回撥是如何被回撥的?
- java高階用法之:JNA中的回撥Java
- Java_介面回撥與匿名內部類Java
- 在Java中實現回撥過程 (轉)Java
- 回撥函式函式
- 微博回撥介面
- 非同步/回撥非同步
- JS 回撥模式JS模式
- js 回撥 callbackJS