前言:在实际的业务中总有这样的场景,后台执行的时间过长,前端需要立即返回结果,以取得良好的客户体验。那么后台的异步调用改怎么实现呢?
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框架提供了很多遍历,在使用框架的过程中,多去了解框架的实现原理,比只学习如何使用有用的多。