標籤:
在網上看到了一個比喻,覺得很形象,這裡借用一下:
你有一個複雜的問題解決不了,打電話給你的同學,你的同學說可以解決這個問題,但是需要一些時間,那麼你不可能一直拿著電話在那裡等,你會把你的電話號碼告訴他,讓他解決之後打電話通知你。回調就是體現在你的同學又反過來撥打你的號碼。
結合到前面所分析的,你打電話給你同學就是【you call me】,你同學解決完之後打電話給你就是【i call you back】。
下面再給出一個關於利用回調配合非同步呼叫的很不錯的例子,來源於http://kt8668.iteye.com/blog/205739 回調介面:
Java代碼
- public interface CallBack {
- /**
- * 執行回調方法
- * @param objects 將處理後的結果作為參數返回給回調方法
- */
- public void execute(Object... objects );
- }
訊息的寄件者:
Java代碼
- /**
- * 這個類相當於你自己
- */
- public class Local implements CallBack,Runnable{
-
- private Remote remote;
-
- /**
- * 發送出去的訊息
- */
- private String message;
-
- public Local(Remote remote, String message) {
- super();
- this.remote = remote;
- this.message = message;
- }
-
- /**
- * 發送訊息
- */
- public void sendMessage()
- {
- /**當前線程的名稱**/
- System.out.println(Thread.currentThread().getName());
- /**建立一個新的線程發送訊息**/
- Thread thread = new Thread(this);
- thread.start();
- /**當前線程繼續執行**/
- System.out.println("Message has been sent by Local~!");
- }
-
- /**
- * 發送訊息後的回呼函數
- */
- public void execute(Object... objects ) {
- /**列印返回的訊息**/
- System.out.println(objects[0]);
- /**列印發送訊息的線程名稱**/
- System.out.println(Thread.currentThread().getName());
- /**中斷髮送訊息的線程**/
- Thread.interrupted();
- }
-
- public static void main(String[] args)
- {
- Local local = new Local(new Remote(),"Hello");
-
- local.sendMessage();
- }
-
- public void run() {
- remote.executeMessage(message, this); //這相當於給同學打電話,打完電話之後,這個線程就可以去做其他事情了,只不過等到你的同學打回電話給你的時候你要做出響應
-
- }
- }
訊息的接收者:
Java代碼
- /**
- * 這個類相當於你的同學
- */
- public class Remote {
-
- /**
- * 處理訊息
- * @param msg 接收的訊息
- * @param callBack 回呼函數處理類
- */
- public void executeMessage(String msg,CallBack callBack)
- {
- /**類比遠程類正在處理其他事情,可能需要花費許多時間**/
- for(int i=0;i<1000000000;i++)
- {
-
- }
- /**處理完其他事情,現在來處理訊息**/
- System.out.println(msg);
- System.out.println("I hava executed the message by Local");
- /**執行回調**/
- callBack.execute(new String[]{"Nice to meet you~!"}); //這相當於同學執行完之後打電話給你
- }
-
- }
由上面這個例子可見,回調可以作為非同步呼叫的基礎來實現非同步呼叫。
深入淺出Java回調機制