一、同步調(diào)用
同步調(diào)用是最基本的調(diào)用方式。類A的a()方法調(diào)用類B的b()方法,類A的方法需要等到B類的方法執(zhí)行完成才會繼續(xù)執(zhí)行。如果B的方法長時間阻塞,就會導致A類方法無法正常執(zhí)行下去。
二、異步調(diào)用
如果A調(diào)用B,B的執(zhí)行時間比較長,那么就需要考慮進行異步處理,使得B的執(zhí)行不影響A。通常在A中新起一個線程用來調(diào)用B,然后A中的代碼繼續(xù)執(zhí)行。
異步通常分兩種情況:
- 第一,不需要調(diào)用結(jié)果,直接調(diào)用即可,比如發(fā)送通知;
- 第二,需要異步調(diào)用結(jié)果,在Java中可使用Future+Callable實現(xiàn)。
三、回調(diào)
通常回調(diào)分為:同步回調(diào)和異步回調(diào)。
其中同步回調(diào)與同步調(diào)用類似,代碼運行到某一個位置的時候,如果遇到了需要回調(diào)的代碼,會在這里等待,等待回調(diào)結(jié)果返回后再繼續(xù)執(zhí)行。
異步回調(diào)與異步調(diào)用類似,代碼執(zhí)行到需要回調(diào)的代碼的時候,并不會停下來,而是繼續(xù)執(zhí)行,當然可能過一會回調(diào)的結(jié)果會返回回來。
1、同步回調(diào)
制作Callback接口
public interface Callback {
void CallbackData(String Data);
}
自定義向小明提問的人:
public class CallbackHanler implements Callback{
Caller caller;
public CallbackHanler(Caller caller) {
this.caller = caller;
}
@Override
public void CallbackData(String Data) {
Log.d("TAG!","你懂了,答案為"+Data);
}
public void ask(){
caller.DoWork(this);
}
}
大佬小明:
public class Caller {
public void DoWork(Callback callback){
Log.d("TAG!","小明進行自己的工作");
try {
Thread.sleep(5000);
Log.d("TAG!","開始解決你的問題");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Log.d("TAG!","問題答案為2");
//傳遞問題答案
callback.CallbackData("2");
}
}
在Main函數(shù)中調(diào)用這兩個類:
Caller caller = new Caller();
CallbackHanler callbackHanler = new CallbackHanler(caller);
callbackHanler.ask();
Log.d("TAG!","你在等待。。。。");
打印結(jié)果如下:
上面的實例演示了同步回調(diào),很明顯在調(diào)用的過受到Caller
執(zhí)行時長的影響,需要等到Caller
處理完才能繼續(xù)執(zhí)行CallbackHanler
方法中的后續(xù)代碼。
2、異步回調(diào)
修改CallbackHanler的ask()方法如下:
public void ask(){
new Thread(()-> caller.DoWork(this)).start();
}
打印結(jié)果如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-620673.html
通過Main函數(shù)的Log.d(“TAG!”,“你在等待。。。?!?;可以知道,此時main函數(shù)沒有等待ask(),而是直接繼續(xù)執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-620673.html
到了這里,關(guān)于JAVA的回調(diào)機制、同步/異步調(diào)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!