java - 主线程不等待CompletableFuture.runAsync()并返回响应

标签 java multithreading completable-future

我有一个具有invoke方法的函数,该函数在内部调用soap API,
而且执行过程大约需要22秒,代码中几乎没有其他方法,
因此,完全deleteSoemthing()(下面的代码)方法大约需要24秒,
现在,我尝试在单独的线程中运行耗时方法,
所以我的假设是,即使它是单独的线程,它也会被优化为2秒,因为它从总共24秒中花费了22秒。
因此可能需要22秒,而不是24秒,因为它是并行运行的。
但是,当我通过 postman 运行此程序时,只需2秒钟即可执行,这意味着响应将在2秒钟内返回。并且单独的线程保持运行(当我通过调试检查时)。
因此,我的怀疑是,主线程是否不等待此任务完成并将响应发送回去。
或仅发送响应并在后台继续运行异步任务

void deleteSomething(){

CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
                try {
                    invoke("invoking a soap API"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

//some other code

}

最佳答案

如果您希望主线程(请求)并行处理“其他代码”和“调用SOAP API”,然后合并并将响应返回给最终用户,则此方法将无效。
当我们创建CompletableFuture实例时,它将在另一个线程中分离计算并立即返回Future。如果需要阻止结果,则需要在其上调用get方法。但是,此过程仍需要22 + 2 = 24秒才能返回响应。
要并行运行这两个任务,您应该创建两个可调用的,并将其提交给 ExecutorService
例如。

  public void deleteSomething(){
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    Collection<Callable<Void>> callables = new ArrayList<>();
    callables.add(() -> doSomeOtherTask());
    callables.add(() -> invokeSoapApi());
    try {
      List<Future<Void>> taskFutureList = executorService.invokeAll(callables);
      taskFutureList.get(0).get();
      taskFutureList.get(1).get();
    } catch (InterruptedException | ExecutionException e) {
      //error
    }
  }

  public Void doSomeOtherTask() {
    //some other code
    return null;
  }

  public Void invokeSoapApi() {
    //soap api call
    return null;
  }

请注意,线程池应在应用程序启动时创建。
因此,如果您实际上希望使用它,则应将“executorService”定义为实例变量。例如。
@Service
public class MyService {

  ...
  ...
  private ExecutorService executorService = Executors.newFixedThreadPool(2);
  ...
  ...
  //your methods
}

关于java - 主线程不等待CompletableFuture.runAsync()并返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62859977/

相关文章:

c# - Android客户端发送和接收TCP套接字

java - 如何通过 gradle (在函数中)在本地 Maven 存储库中安装子项目?

java - Servlet 加载新页面

c - 使用线程实现进度控制

java - Java CompletableFuture 的 thenApply 和 thenApplyAsync 有什么区别?

java - ThreadPoolTask​​Executor 抛出 RejectedExecutionException

java - 结合 JAX-RS 和 JAX-WS

ios - 终止前一个函数后调用下一个函数

python - 使用python从USB输入线程(麦克风)捕获一个音频样本

java - 用 Java 8 CompletableFuture 替换 Futures.successfulAsList?