java 回撥的原理與實現
阿新 • • 發佈:2018-12-18
回撥函式,顧名思義,用於回撥的函式。回撥函式只是一個功能片段,由使用者按照回撥函式呼叫約定來實現的一個函式。回撥函式是一個工作流的一部分,由工作流來決定函式的呼叫(回撥)時機。
回撥原本應該是一個非常簡單的概念,但是可能因為平時只用系統為我們寫好的回撥的介面了,自己很少實現回撥,所以在自己實現回撥的時候還是有一點點暈的,現在寫這篇文章記錄一下,也和大家分享一下怎麼寫回調介面。
回撥
回撥的概念:舉個例子就是,我們想要問別人一道題,我們把題跟對方說了一下,對方說好,等我做完這道題,我就告訴你,這個時候就用到了回撥,因為我們並不知道對方什麼時候會做完,而是對方做完了來主動找我們。
同步回撥
程式碼執行到某一個位置的時候,如果遇到了需要回調的程式碼,會在這裡等待,等待回撥結果返回後再繼續執行。
非同步回撥
程式碼執行到需要回調的程式碼的時候,並不會停下來,而是繼續執行,當然可能過一會回撥的結果會返回回來。
總體的程式碼還是很簡單的,就是模擬了一個印表機,還有一個人,印表機具有列印的功能,但是列印需要時間,不能在收到任務的同時給出反饋,需要等待一段時間才能給出反饋。
這個人想做的就是列印一份簡歷,然後知道列印的結果。這裡面程式碼實現了這兩種方式。
具體程式碼:
Callback.java
public interface Callback {
void printFinished(String msg);
}
Printer.java
public class Printer {
public void print(Callback callback) {
System.out.println("正在列印 . . . ");
try {
Thread.currentThread();
Thread.sleep(3000);// 毫秒
} catch (Exception e) {
e.printStackTrace();
}
callback.printFinished("列印完成") ;
}
}
People.java
public class People {
Printer printer = new Printer();
/*
* 同步回撥
*/
public void goToPrintSyn(Callback callback) {
printer.print(callback);
}
/*
* 非同步回撥
*/
public void goToPrintASyn(Callback callback) {
new Thread(new Runnable() {
public void run() {
printer.print(callback);
}
}).start();
}
}
Main.java 測試類,同步回撥
public class Main {// 測試類,同步回撥
public static void main(String[] args) {
People people = new People();
Callback callback = new Callback() {
@Override
public void printFinished(String msg) {
System.out.println("印表機告訴我的訊息是 ---> " + msg);
}
};
System.out.println("需要列印的內容是 ---> " + "列印一份簡歷");
people.goToPrintSyn(callback);
System.out.println("我在等待 印表機 給我反饋");
}
}
需要列印的內容是 ---> 列印一份簡歷
正在列印 . . .
印表機告訴我的訊息是 ---> 列印完成
我在等待 印表機 給我反饋
Main.java 測試類,非同步回撥
public class Main {// 測試類,非同步回撥
public static void main(String[] args) {
People people = new People();
Callback callback = new Callback() {
@Override
public void printFinished(String msg) {
System.out.println("印表機告訴我的訊息是 ---> " + msg);
}
};
System.out.println("需要列印的內容是 ---> " + "列印一份簡歷");
people.goToPrintASyn(callback);
System.out.println("我在等待 印表機 給我反饋");
}
}
需要列印的內容是 ---> 列印一份簡歷
我在等待 印表機 給我反饋
正在列印 . . .
印表機告訴我的訊息是 ---> 列印完成