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

使用线程池小于任务的ExecutorService

孟杰
2023-03-14
    null
ExecutorService threadExecutor = Executors.newFixedThreadPool(10);
List<Status> statusList = getStatusList();
List<PersonInfoWrapper> personInfoWrapperList = new ArrayList<>();

for(Status status: statusList ){
    List<PersonInfo> personInfo = status.getPersonList();
    List<Future<PersonInfoWrapper> futures = new ArrayList<>();

    for(PersonInfo info : personInfo){
         Future<PersonInfoWrapper> future = threadExecutor.submit(() -> processInfo(info));
         futures.add(future);
    }

    for(Future<PersonInfoWrapper> future : futures ){
         personInfoWrapperList .add(future.get());
    }
}
threadExecutor.shutdown();

共有1个答案

阮炯
2023-03-14
  1. 我建议您使用executors.newCachedThreadPool(),因此,如果您的人员多于线程,则该轮询将根据需要自动创建新线程,并在以前构造的线程可用时重用它们。如果没有可用的现有线程,将创建一个新线程并将其添加到池中。60秒内未使用的线程将被终止并从缓存中删除。因此,空闲时间足够长的池将不会消耗任何资源。

Future为您提供了不阻塞的方法isDone(),如果计算已经完成,则返回true,否则返回false。

get()用于检索计算结果。

    null
 类似资料:
  • 我正在创建一个可以监视100-150个设备的监视应用程序...现在要设计一个监视器应用程序,我有两种方法: > < li> 为每个要监控的设备创建一个线程,每个线程将ping(使用ICMP)设备以了解设备是否在线。这些线程将无限期地运行,以便在特定的时间间隔(比如60秒)后了解它们的状态。 创建一个线程池,并为每个设备提交一个任务到一个线程池。任务是简单地 ping 到设备。因此,在当前设计中,任

  • 本文向大家介绍Java 使用线程池执行多个任务的示例,包括了Java 使用线程池执行多个任务的示例的使用技巧和注意事项,需要的朋友参考一下 在执行一系列带有IO操作(例如下载文件),且互不相关的异步任务时,采用多线程可以很极大的提高运行效率。线程池包含了一系列的线程,并且可以管理这些线程。例如:创建线程,销毁线程等。本文将介绍如何使用Java中的线程池执行任务。 1 任务类型 在使用线程池执行任务

  • JavaExecutorService框架允许您使用托管线程池委托要执行的多个任务,以便一次可以执行N个任务X个任务,直到完成。 我的问题是。。。如果N是一个无限大的数字,或者太大以至于最初无法分配/分配/定义,该怎么办。 如何利用Java(ExecutorService)中的线程池概念来处理比合理提交更多的任务,而不会耗尽资源。 为了回答这个问题,假设每个任务都是自包含的,不依赖于任何其他任务,

  • 问题内容: 现在我想在进入for循环之前集中所有任务,但是当我运行此程序时,for循环会在此之前执行并引发此异常: 问题答案: 一种工作方式是,当您调用它时,它等待所有任务完成: 执行给定的任务,并在所有任务完成时返回保存其状态和结果的期货列表。Future.isDone()对于返回列表的每个元素为true。 请注意,已完成的任务可能已正常终止或引发了异常而终止 。如果在进行此操作时修改了给定的集

  • 问题内容: 我使用线程池来执行任务,这些任务大多基于cpu并带有一点I / O,其大小比cpus的数量大一倍。 假设有一个简单的程序将所有任务提交给该执行程序,并且几乎没有做其他事情,那么我认为拥有更大的线程池会减慢速度,因为操作系统必须对它进行cpus切片,才有机会给线程池中的每个线程分配机会。跑。 是正确的吗,如果是这样,这是一个实际问题还是主要是理论问题,即如果我将线程池大小增加到1000,

  • 我的应用程序在捕获线程中捕获网络数据包(如wireshark),并允许其他组件向捕获的数据包注册带有过滤条件的回调函数。此时,每次捕获一个数据包时,我都会为每个回调订户启动一个线程,如下所示: 这些线程中的每一个可能只运行几毫秒,但根据回调方法的不同,可以运行更长的时间。它们在每次捕获数据包时启动,这可能非常频繁。 我现在的问题是:启动一个新线程的开销有多高?使用一个不断运行的线程池而不是高频创建