【问题标题】:How to call a function in parallel using list?如何使用列表并行调用函数?
【发布时间】:2022-01-21 03:34:17
【问题描述】:

我有一个包含值的列表,我想使用执行器服务调用一个函数,该列表中的函数只有一个参数字符串。例如我有 -

private List<String> namesList = new ArrayList<>();

private ExecutorService exeService = Executors.newFixedThreadPool(10);

private void printNames(String name);

我想调用这个函数 printNames 使用列表值与执行器服务并行,即如果我的列表大小为 10,那么应该为该列表数据并行调用这个函数。

可以做输入会很有帮助吗?

【问题讨论】:

  • 你卡在哪一部分了?
  • @tgdavies 我有一个线程池,我有一个列表,我坚持的部分是使用并行执行程序服务并行调用函数。
  • 使用循环并将一个 Runnable 传递给列表中每个项目的执行程序。
  • @tgdavies 将对此有所帮助 - for(String s1: nameList) { exeService.submit(() -&gt; { runBatch(s1); }); }
  • @tgdavies 您能否详细说明您的答案,因为我对 java 中的执行程序服务非常陌生?

标签: java multithreading concurrency parallel-processing


【解决方案1】:

如果您想使用执行器服务为每个列表条目执行您的方法,您必须首先让您的方法由 RunnableCallable 对象执行:

Runnable task = () -> printNames(name);

然后提交给执行器服务:

executorService.submit(task);
class NamePrinter {
  public static void main(String[] args) {
    List<String> names = List.of("Qui-Gon Jinn", "Mace Windu", "Ahsoka Tano", "Plo Koon", "Kit Fisto", "Aalya Secura");
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    for (String name : names) {
      executorService.submit(() -> printName(name));
    }
    executorService.shutdown();
  }

  public static void printName(String name) {
    System.out.println(name + " was executed by " + Thread.currentThread().getName());
  }
}

您应该考虑使用parallelStream 来并行处理列表:

names.parallelStream().forEach(NamePrinter::printName);

这将在幕后使用ForkJoinPool 执行器服务。

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 2017-06-29
    • 2013-02-12
    • 2020-12-22
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多