日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java回调函数(callBack)

發(fā)布時間:2023/12/9 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java回调函数(callBack) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ?最近有個新同事給我寫了個接口,說是用到了回調(diào),我等了半天發(fā)現(xiàn)結(jié)果才返回回來,把我都整急了。最后我看了他的代碼,目瞪口呆。他還信誓旦旦的說沒錯,按網(wǎng)上的例子來寫的。

? ? ? ?我一搜,網(wǎng)上例子真一大堆,并且都尼瑪差不多。

首先,定義寫的不錯:經(jīng)理A下班前打電話給程序猿B,叫他加班搞定一個項目,然后經(jīng)理A就掛了電話,程序猿B加班搞定了整個項目,并打電話告訴了經(jīng)理A。程序猿B將結(jié)果告訴經(jīng)理A的這個行為就是回調(diào)。

? ? ? 網(wǎng)上有句話叫做什么?應聘造就面試人才!!!這句話真的沒錯。。。先來看他們的demo(大致如下面寫的):

ClassA.java(表示經(jīng)理A) package com.example.demo1.dto;public class ClassA {public static void sendCommand(String command){ClassB.acceptCommand(command);}public static void callBack(String str){System.out.print(str);} }

ClassB.java(表示程序猿B)

package com.example.demo1.dto;public class ClassB {public static void acceptCommand(String command){System.out.print("收到命令:"+command+"\n");doSomething(command);ClassA.callBack("命令【"+command+"】執(zhí)行完畢!\n");}public static void doSomething(String command){System.out.print("正在執(zhí)行命令:"+command+"\n");} }

執(zhí)行結(jié)果:

然后再接著還進行了一些抽象封裝。

看到上面,我要是經(jīng)理A,我肯定讓你將代碼提交一下,然后告訴你不用來上班了!我是卸磨殺驢嗎?不是,是你技術(shù)太渣!

? ? ? ?為什么這么說呢?明明下了命令后我是是可以約妹子去聊聊人生,聊聊理想的。結(jié)果呢,丫的,下了命令,卻不能掛電話,還得聽你在那啰里吧嗦的,直到你說搞好了。。。

? ? ? 怎么是這樣呢?明明用了回調(diào)函數(shù)呀!但你有沒有發(fā)現(xiàn),你這回調(diào)函數(shù)用的,跟直接return?沒有區(qū)別,也就是ClassA.callBack("命令【"+command+"】執(zhí)行完畢!\n");跟直接?return?"命令【"+command+"】執(zhí)行完畢!\n";的效果一樣!!

? ? ? ? 我將定義抽象一下,A向B發(fā)送請求,B由于執(zhí)行時間比較長,無法立刻知道結(jié)果,就只是告訴A收到你的請求了,然后埋頭干活,干完后,再通知A最終的結(jié)果。

? ? ? ?這個例子寫得是像模像樣的,但關(guān)鍵是沒整明白,回調(diào)主要是用在異步上面,像這樣用在同步上面,就沒什么意義了。

那該如何改了,很簡單,將ClassB.java改一下就好了,更改后代碼如下:

package com.example.demo1.dto;public class ClassB {public static void acceptCommand(String command){System.out.print("收到命令:"+command+"\n");new Thread(new Runnable() {@Overridepublic void run() {System.out.print("正在執(zhí)行命令:"+command+"\n");ClassA.callBack("命令【"+command+"】執(zhí)行完畢!\n");}}).start();ClassA.callBack("收到命令【"+command+"】了,馬上開始執(zhí)行!\n");} }

執(zhí)行結(jié)果如下:

通過這個,效果就達到了。經(jīng)理A下班前打電話給程序猿B,叫他加班搞定一個項目,程序猿B說:“收到,馬上開干!”,然后經(jīng)理A掛了電話就約妹去了。然后程序猿B干完了之后,給經(jīng)理A回了一個電話:"搞定了!"。經(jīng)理A一想,小伙子靠譜啊,看來得給你加薪了,免得被人挖走了。

?

至于抽象封裝就自己搞定哈。

?

? ? ? ?在同一個服務中,上面的回掉是沒有任何問題的,但如果是跨系統(tǒng)跨服務,那么該怎么實現(xiàn)回掉呢,畢竟你的class和方法別人是無法拿的到的。這時候,一般可以采用消息推送。IM即時通信系統(tǒng),推送是很簡單的,其他系統(tǒng),也可以采用消息中間件MQ進行結(jié)果的推送,當然,最簡單的是增加一個參數(shù),讓A請求的時候帶上回掉的URL,然后B處理完后,通過Httpclient調(diào)用該URL將結(jié)果通知A。像微信公眾號的模板消息,群發(fā)消息結(jié)果的通知就是這么干的。

? ? ? 總之,回調(diào)是一種思想,不要拘泥于形式。

總結(jié)

以上是生活随笔為你收集整理的java回调函数(callBack)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。