1. 程式人生 > >java 回撥的原理與實現

java 回撥的原理與實現

回撥函式,顧名思義,用於回撥的函式。回撥函式只是一個功能片段,由使用者按照回撥函式呼叫約定來實現的一個函式。回撥函式是一個工作流的一部分,由工作流來決定函式的呼叫(回撥)時機。

回撥原本應該是一個非常簡單的概念,但是可能因為平時只用系統為我們寫好的回撥的介面了,自己很少實現回撥,所以在自己實現回撥的時候還是有一點點暈的,現在寫這篇文章記錄一下,也和大家分享一下怎麼寫回調介面。

回撥

回撥的概念:舉個例子就是,我們想要問別人一道題,我們把題跟對方說了一下,對方說好,等我做完這道題,我就告訴你,這個時候就用到了回撥,因為我們並不知道對方什麼時候會做完,而是對方做完了來主動找我們。

同步回撥

程式碼執行到某一個位置的時候,如果遇到了需要回調的程式碼,會在這裡等待,等待回撥結果返回後再繼續執行。

非同步回撥

程式碼執行到需要回調的程式碼的時候,並不會停下來,而是繼續執行,當然可能過一會回撥的結果會返回回來。

總體的程式碼還是很簡單的,就是模擬了一個印表機,還有一個人,印表機具有列印的功能,但是列印需要時間,不能在收到任務的同時給出反饋,需要等待一段時間才能給出反饋。
這個人想做的就是列印一份簡歷,然後知道列印的結果。這裡面程式碼實現了這兩種方式。

具體程式碼:
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("我在等待 印表機 給我反饋");
	}
}
需要列印的內容是 ---> 列印一份簡歷
我在等待 印表機 給我反饋
正在列印 . . . 
印表機告訴我的訊息是 ---> 列印完成