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