1. 程式人生 > >JAVA的非同步呼叫

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框架提供了很多遍歷,在使用框架的過程中,多去了解框架的實現原理,比只學習如何使用有用的多。