JAVA的非同步呼叫
阿新 • • 發佈:2019-02-20
前言:在實際的業務中總有這樣的場景,後臺執行的時間過長,前端需要立即返回結果,以取得良好的客戶體驗。那麼後臺的非同步呼叫改怎麼實現呢?
1、 使用callable介面,加執行緒池
2、 使用JAVA的回撥機制
3、 使用spring框架預設的非同步呼叫方式
一、第一種方式是比較簡單,也比較常用的方式,下面看一段示例程式碼:
public void sync(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//無返回值的業務程式碼
}
});
ExecutorService executorService = Executors.newFixedThreadPool(5);
Future<Object> submit = executorService.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
//有返回值的業務程式碼
return "";
}
});
boolean done = submit.isDone();
//針對執行情況進行響應,也可以單獨寫一個輪詢方法,進行業務的輪詢
}
二、回撥機制
這種方式的回撥就是
類A的a()方法,呼叫類B的b()方法
類B的b()方法,執行完畢主動呼叫類A的callback()的方法。
舉個例子:
回撥介面:
/**
* Created by xiekeyi on 2017/12/5.
*/
public interface MyCallback {
void callback();
//回撥方法
}
執行者:
public class Trigger implements MyCallback {
private MyJob job;
Trigger(MyJob job){
this.job=job;
}
@Override
public void callback() {
}
void exe(){
job.execute(this);
}
}
業務部分:
public class MyJob{
void execute(MyCallback callback){
//執行完業務方法之後,執行回撥
callback.callback();
}
}
核心原理就是,把業務物件傳入執行者。實現回撥,當然可以進一步抽象業務類。
呼叫的時候,使用執行緒,進行非同步處理。
三、第三種方式使用,spring 框架特有的註解作用於方法上,實現非同步呼叫。
@async註解
@Async
public void sync(){
總結:無論多麼優雅的實現方式,都不如框架來的方便,spring框架提供了很多遍歷,在使用框架的過程中,多去了解框架的實現原理,比只學習如何使用有用的多。