java基礎-回調函數(callback)java
做者:尹正傑ide
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。函數
回調函數就是一個經過函數指針調用的函數。若是你把函數的指針(地址)做爲參數傳遞給另外一個函數,當這個指針被用來調用其所指向的函數時,咱們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。oop
在C和C++中有回調函數數一個顯而易見的東西,可是在Java中它沒有這個機制,只能咱們手動實現。本篇博客就用Java實現一個簡單的回調函數案例。this
一.Java回調機制spa
1>.Class A 實現接口 CallBack callback;
2>.Class A 中包含一個lB的引用b;
3>.Class B 有一個參數爲callback 的方法f(CallBack callback);
4>.Class A的對象a調用Class B方法f(CallBack callback),換句話說,就是A類調用B類的某個方法c;
5>.而後b就能夠在f(CallBack callback)方法中調用A的方法,換句話說就是B類調用A類的某個方法d;指針
二.案例展現code
1>.場景分析對象
立刻快到週五了,小明想要跟他的女友一塊兒去看電影,如下是他們的通話記錄:blog
小明說:[親愛的,週五有部電影要首映,我關注了很久,咱們一塊兒去看吧,從19:00~23:30均可以看,你啥時候下班呢?]
小紅說:[啊~啊~好刺激呀,我在吃辣條呢,一會打給你]
小明說:[那我先忙手上的工做了!]
小紅說:[下班我回家換套衣服,要不晚上10:30不見不散!]
2>.代碼實現
CallBack.java 代碼以下:
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ EMAIL:y1053419035@qq.com */ package cn.org.yinzhengjie.hdfs; public interface CallBack { /** * 這是小紅知道答案時要調用的函數告訴小明,也就是回調函數,這個接口我是能夠自定義喲。 */ public abstract void resolv(String result); }
XiaoMing.java 文件內容以下:
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ EMAIL:y1053419035@qq.com */ package cn.org.yinzhengjie.hdfs; /** * 這是小明 * 實現了一個回調接口CallBack。 */ public class XiaoMing implements CallBack { /** * 建立一個對小紅對象的引用 */ private XiaoHong xiaohong; /** * 小明的構造方法,持有對Xiaohong的引用 */ public XiaoMing(XiaoHong xiaohong) { this.xiaohong = xiaohong; } public XiaoMing() { } /** * 小明經過這個方法去問小紅問題 */ public void askQuestion(final String question) throws InterruptedException { Thread ask = new Thread() { @Override public void run() { try { xiaohong.execute(XiaoMing.this, question); } catch (Exception ex) { ex.printStackTrace(); } } }; ask.start(); // ask.join(); //小明問完問題掛掉電話就去忙工做上的事情了 work(); } public void work(){ String work = "小明說:[那我先忙手上的工做了!]"; System.out.println(work); } /** * 這是小紅肯定了看電影的具體時間,調用此方法告訴小明,就是所謂的小明的回調方法。 */ public void resolv(String result) { System.out.printf("小紅說:[%s]\n",result); } }
XiaoHong.java 文件內容以下:
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ EMAIL:y1053419035@qq.com */ package cn.org.yinzhengjie.hdfs; /** * 這個就是小紅 */ public class XiaoHong { /** *小明問的問題 */ public void execute(CallBack callBack ,String question) throws InterruptedException { System.out.println(question); //模擬小紅辦本身的事情須要很長時間 System.out.println("小紅說:[啊~啊~好刺激呀,我在吃辣條呢,一會打給你]"); Thread.sleep(10000); //小紅辦完本身的事情以後就想到了答案是「晚上加班,去不了啦,下次吧!」 String result = "下班我回家換套衣服,要不晚上10:30不見不散!"; /** * 因而就打電話告訴小明,調用小明中的方法。 */ callBack.resolv(result); } }
Demo.java 文件內容以下:
/* @author :yinzhengjie Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ EMAIL:y1053419035@qq.com */ package cn.org.yinzhengjie.hdfs; public class Demo { public static void main(String[] args) throws InterruptedException { XiaoHong xiaoHong = new XiaoHong(); XiaoMing xiaoMing = new XiaoMing(xiaoHong); String question = "小明說:[親愛的,週五有部電影要首映,我關注了很久,咱們一塊兒去看吧,從19:00~23:30均可以看,你啥時候下班呢?]"; xiaoMing.askQuestion(question); } }
3>.小結
xiaoMing調用xiaoHong的execute方法,xiaoHong在execute方法中經過CallBack接口調用xiaoMing的resolve。