詳解Java回調(diào)的原理與實現(xiàn)
回調(diào)原本應(yīng)該是一個非常簡單的概念,但是可能因為平時只用系統(tǒng)為我們寫好的回調(diào)的接口了,自己很少實現(xiàn)回調(diào),所以在自己實現(xiàn)回調(diào)的時候還是有一點點暈的,現(xiàn)在寫這篇文章記錄一下,也和大家分享一下怎么寫回調(diào)接口。
回調(diào)
回調(diào)的概念:舉個例子就是,我們想要問別人一道題,我們把題跟對方說了一下,對方說好,等我做完這道題,我就告訴你,這個時候就用到了回調(diào),因為我們并不知道對方什么時候會做完,而是對方做完了來主動找我們。
同步回調(diào)
代碼運行到某一個位置的時候,如果遇到了需要回調(diào)的代碼,會在這里等待,等待回調(diào)結(jié)果返回后再繼續(xù)執(zhí)行。
異步回調(diào)
代碼執(zhí)行到需要回調(diào)的代碼的時候,并不會停下來,而是繼續(xù)執(zhí)行,當然可能過一會回調(diào)的結(jié)果會返回回來。
具體代碼:
總體的代碼還是很簡單的,就是模擬了一個打印機,還有一個人,打印機具有打印的功能,但是打印需要時間,不能在收到任務(wù)的同時給出反饋,需要等待一段時間才能給出反饋。這個人想做的就是打印一份簡歷,然后知道打印的結(jié)果。這里面代碼實現(xiàn)了這兩種方式。
Callback.java
public interface Callback { void printFinished(String msg); }
Printer.java
public class Printer { public void print(Callback callback, String text) { System.out.println("正在打印 . . . "); try { Thread.currentThread(); Thread.sleep(3000);// 毫秒 } catch (Exception e) { } callback.printFinished("打印完成"); } }
People.java
public class People { Printer printer = new Printer(); /* * 同步回調(diào) */ public void goToPrintSyn(Callback callback, String text) { printer.print(callback, text); } /* * 異步回調(diào) */ public void goToPrintASyn(Callback callback, String text) { new Thread(new Runnable() { public void run() { printer.print(callback, text); } }).start(); } }
Main.java
public class Main {//測試類,同步回調(diào) 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("需要打印的內(nèi)容是 ---> " + "打印一份簡歷"); people.goToPrintSyn(callback, "打印一份簡歷"); System.out.println("我在等待 打印機 給我反饋"); } }
Main.java
public class Main {//異步回調(diào) 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("需要打印的內(nèi)容是 ---> " + "打印一份簡歷"); people.goToPrintASyn(callback, "打印一份簡歷"); System.out.println("我在等待 打印機 給我反饋"); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在springboot3微項目中如何用idea批量創(chuàng)建單元測試邏輯
這篇文章主要介紹了在SpringBoot3項目中使用IntelliJIDEA批量創(chuàng)建單元測試包括準備工作(確保項目配置正確,添加測試依賴),使用IntelliJIDEA創(chuàng)建測試,感興趣的朋友一起看看吧2024-10-10Spring?boot?整合?Redisson實現(xiàn)分布式鎖并驗證功能
這篇文章主要介紹了Spring?boot?整合?Redisson實現(xiàn)分布式鎖并驗證,redisson是官方推薦的分布式鎖實現(xiàn)方案,采用redis自身的原子命令和lua腳本來實現(xiàn),需要的朋友可以參考下2022-05-05java并發(fā)編程專題(十)----(JUC原子類)基本類型詳解
這篇文章主要介紹了java JUC原子類基本類型詳解的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07SpringMVC @RequestMapping注解應(yīng)用方法示例講解
通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-09-09JavaWeb基于Session實現(xiàn)的用戶登陸注銷方法示例
為了安全起見,session常常用來保存用戶的登錄信息。那么服務(wù)器是怎么來實現(xiàn)的呢?下面這篇文章就來給大家介紹了關(guān)于JavaWeb基于Session實現(xiàn)的用戶登陸注銷的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12JPA?@ManyToMany?報錯StackOverflowError的解決
這篇文章主要介紹了JPA?@ManyToMany?報錯StackOverflowError的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Arthas在線java進程診斷工具在線調(diào)試神器詳解
Arthas是 Alibaba 開源的Java診斷工具,深受開發(fā)者喜愛。這篇文章主要介紹了Arthas在線java進程診斷工具 在線調(diào)試神器,需要的朋友可以參考下2021-11-11