当前位置: 首页 > 知识库问答 >
问题:

异步调用API Java

邓阳炎
2023-03-14

我正在遍历ID列表并进行查找以获取对象。 我是多线程的新手,有没有一种不使用并行流的方法来处理这个问题?

private List<MyObject> lookupById(List<String> ids) {
  List<MyObject> myObjs = new ArrayList<>();

  for(String id : ids) {
    myObjs.add(apiService.lookUp(id));
  }

  return myObjs;
}

共有2个答案

马浩淼
2023-03-14

这里有一种执行程序服务的方法。

ExecutorService pool = Executors.newFixedThreadPool(N);
List<Future<MyObject>> futures = ids.stream().map( 
                                     pool.sumbit( 
                                         id->apiService.lookUp(id) 
                                     ).collect( Collectors.toList() );
List<MyObject> myObjs = futures.stream().map( f -> { 
                                                     try { 
                                                         f.get();
                                                     } catch (Exception e){         
                                                         return null;
                                                     }
                                             ).collect( Collectors.toList());

这样可以保持列表的顺序。 否则,线程版本可能就足够了。 我不知道你为什么不直接使用并行流。

祁嘉瑞
2023-03-14

我是这么想的:

private List<MyObject> lookupById(List<String> ids) {

    List<MyObject> myObjs = Collections.synchronizedList(new ArrayList<>());

    AtomicInteger jobs = new AtomicInteger(ids.size());
    ids.forEach(e -> {

        new Thread(() -> {

            myObjs.add(apiService.lookUp(e));
            jobs.decrementAndGet();

        }).start();

    });

    //this can be infite loop if one of the thread get stuck at apiService.loopUp
    while(jobs.get() > 0){
        Thread.sleep(1);
    }

    return myObjs;

}

也可以有其他的方法。

 类似资料:
  • 本文向大家介绍JavaScript 异步调用,包括了JavaScript 异步调用的使用技巧和注意事项,需要的朋友参考一下 问题 可修改下面的 aa() 函数,目的是在一抄后用 console.log() 输出 want-value 但是,有额外要求: aa() 函数可以随意修改,但是不能有 console.log() 执行 console.log() 语句里不能有 setTimeout 包裹 解

  • Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。 注意:Provider端异步执行和Consumer端异步调用是相互独立的,你可以任意正交组合两端配置 Consumer同步 - Provider同步 C

  • 从v2.7.0开始,Dubbo的所有异步编程接口开始以CompletableFuture为基础 基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。 使用CompletableFuture签名的接口 需要服务提供者事先定义CompletableFuture签名的服务,具体参见服务端异步执行接口定义: public interface Asyn

  • 同步调用异步方法最安全的方法是什么?

  • 问题内容: 我正在尝试使用Okhttp库通过API将我的Android应用程序连接到服务器。 单击按钮就会发生我的API调用,并且我收到以下 android.os.NetworkOnMainThreadException 。我了解这是由于我正在尝试在主线程上进行网络调用,但是我也正努力在Android上寻找一种干净的解决方案,以使该代码如何使用另一个线程(异步调用)。 上面是我的代码,并且在行上抛

  • 我有一个由S3推送事件触发的AWS Lambda。lambda将调用一个API,这将触发一个长时间运行的进程。我认识到我可以配置S3异步调用lambda函数,因此S3不会等待响应,但我很想知道我是否可以配置lambda异步调用我的API。我不希望lambda在过程完成时等待几分钟。有人能给我指出一些概述这个过程的留档吗?提前谢谢。

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调