首页 > 解决方案 > 什么是Java中与异步API接口的良好设计模式

问题描述

我需要在 Java 中链接一系列专有的异步 API 调用。

我把一些有用的东西放在一起(至少在一个愉快的情况下),但想不出更好的方法来组织这段代码。我想知道是否有设计模式或库可以将丑陋包装在一组漂亮的 API 或库中。类似于 , js 承诺或 c++ 中的异步。谢谢 !!

这是我目前所做的:

// call API1
api.send(...., new myMethodCallbackHandler()));

        while (myAtomicFlag.get() == 0) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        if (myAtomicFlag.get() == 1){
            // success 
            successFlag = true;
            myAtomicFlag.set(0);
            .. do more success stuff
            // call API2
        }else{
            successFlag = false;
            // handle problems
        }
}

标签: javamultithreadingasynchronousjava-threads

解决方案


目前,Java 不支持 async/await,但 Kotlin 支持,因此您可以使用 Kotlin 编写这段代码,而您的程序的其余部分可以保留在 Java 中。

然而,Java 有一个 js 承诺的等价物:CompletableFuture。它可以通过以下方式用于您的任务:

for (API api: apilist) {
  MyMethodCallbackHandler handler = new MyMethodCallbackHandler();
  api.send(...., handler);
  try {
    Object result = handler.get();
    .. do more success stuff
  } catch (Throwable ex) {
    // handle problems
  }
}

我假设回调处理程序必须实现以下接口:

interface CallbackHandler {
   void onSuccess(Object result);
   void onError(Throwable error);
}

那么类MyMethodCallbackHandler可以声明为:

class MyMethodCallbackHandler extends CompletableFuture implements CallbackHandler {
   void onSuccess(Object result) {
      super.complete(result);
   }
   void onError(Throwable error) {
      super.completeExceptionally(error);
   }
}

推荐阅读