JAVA的异步调用

前言:在实际的业务中总有这样的场景,后台执行的时间过长,前端需要立即返回结果,以取得良好的客户体验。那么后台的异步调用改怎么实现呢?

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框架提供了很多遍历,在使用框架的过程中,多去了解框架的实现原理,比只学习如何使用有用的多。


版权声明:本文为ant1993原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。