如何基于回調(diào)實(shí)現(xiàn)Java的異步調(diào)用
異步是指調(diào)用發(fā)出后,調(diào)用者不會立刻得到結(jié)果,而是在調(diào)用發(fā)出后,被調(diào)用者通知調(diào)用者,或通過回調(diào)函數(shù)處理這個(gè)調(diào)用。
回調(diào)簡單地說就是B中有一個(gè)A,這樣A在調(diào)用B的某個(gè)方法時(shí)實(shí)際上是調(diào)用到了自己的方法。
利用回調(diào)可以實(shí)現(xiàn)Java的異步調(diào)用,下面的例子來自網(wǎng)上。
回調(diào)接口:
public interface CallBack {
/**
* 執(zhí)行回調(diào)方法
* @param objects 將處理后的結(jié)果作為參數(shù)返回給回調(diào)方法
*/
public void execute(Object... objects );
}
消息的發(fā)送者:
/**
* 這個(gè)類相當(dāng)于你自己
*/
public class Local implements CallBack,Runnable{
private Remote remote;
/**
* 發(fā)送出去的消息
*/
private String message;
public Local(Remote remote, String message) {
super();
this.remote = remote;
this.message = message;
}
/**
* 發(fā)送消息
*/
public void sendMessage()
{
/**當(dāng)前線程的名稱**/
System.out.println(Thread.currentThread().getName());
/**創(chuàng)建一個(gè)新的線程發(fā)送消息**/
Thread thread = new Thread(this);
thread.start();
/**當(dāng)前線程繼續(xù)執(zhí)行**/
System.out.println("Message has been sent by Local~!");
}
/**
* 發(fā)送消息后的回調(diào)函數(shù)
*/
public void execute(Object... objects ) {
/**打印返回的消息**/
System.out.println(objects[0]);
/**打印發(fā)送消息的線程名稱**/
System.out.println(Thread.currentThread().getName());
/**中斷發(fā)送消息的線程**/
Thread.interrupted();
}
public static void main(String[] args)
{
Local local = new Local(new Remote(),"Hello");
local.sendMessage();
}
public void run() {
remote.executeMessage(message, this); //這相當(dāng)于給同學(xué)打電話,打完電話之后,這個(gè)線程就可以去做其他事情了,只不過等到你的同學(xué)打回電話給你的時(shí)候你要做出響應(yīng)
}
}
消息的接收者:
/**
* 這個(gè)類相當(dāng)于你的同學(xué)
*/
public class Remote {
/**
* 處理消息
* @param msg 接收的消息
* @param callBack 回調(diào)函數(shù)處理類
*/
public void executeMessage(String msg,CallBack callBack)
{
/**模擬遠(yuǎn)程類正在處理其他事情,可能需要花費(fèi)許多時(shí)間**/
for(int i=0;i<1000000000;i++)
{
}
/**處理完其他事情,現(xiàn)在來處理消息**/
System.out.println(msg);
System.out.println("I hava executed the message by Local");
/**執(zhí)行回調(diào)**/
callBack.execute(new String[]{"Nice to meet you~!"}); //這相當(dāng)于同學(xué)執(zhí)行完之后打電話給你
}
}
這樣就可以基于回調(diào)實(shí)現(xiàn)異步調(diào)用,當(dāng)消息接受者處理任務(wù)完成后去調(diào)用消息發(fā)送者的方法。
異步調(diào)用的類似實(shí)現(xiàn),當(dāng)圖片加載的比較慢時(shí),可以先加載一張模糊的圖片,當(dāng)圖片加載完成后再去進(jìn)行局部的刷新。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
spring?boot教程之IDEA環(huán)境下的熱加載與熱部署
這篇文章主要介紹了spring?boot系列教程中的IDEA環(huán)境下的熱加載與熱部署的相關(guān)資料,需要的朋友可以參考下2022-09-09
SpringBoot 整合 Netty 多端口監(jiān)聽的操作方法
Netty提供異步的、基于事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò) IO 程序,是目前最流行的 NIO 框架,這篇文章主要介紹了SpringBoot 整和 Netty 并監(jiān)聽多端口,需要的朋友可以參考下2023-10-10
詳解SpringCloud Gateway之過濾器GatewayFilter
這篇文章主要介紹了詳解SpringCloud Gateway之過濾器GatewayFilter,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
SpringBoot CountDownLatch多任務(wù)并行處理的實(shí)現(xiàn)方法
本篇文章主要介紹了SpringBoot CountDownLatch多任務(wù)并行處理的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
解決Spring security5.5.7報(bào)錯(cuò)Encoded password does
這篇文章主要介紹了解決Spring security5.5.7出現(xiàn)Encoded password does not look like BCrypt異常問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
基于spring?data?jpa?@query返回map的踩坑記錄
這篇文章主要介紹了基于spring?data?jpa?@query返回map的踩坑記錄,具有很好的參考價(jià)值,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

