【问题标题】:Multiple threads in for loopfor循环中的多个线程
【发布时间】:2023-03-03 17:51:01
【问题描述】:

我有一个方法需要为列表中的每个元素调用,然后将此列表返回给另一个类中的调用者。我想为每个元素创建一个线程,但我很难弄清楚如何做到这一点。

public List<MyList> threaded(List<Another> another) {
    List<MyList> myList= new ArrayList<>();
    Visibility visi = new Visibility();

    Thread[] threads = new Thread[another.size()];
    for (int i = 0; i < another.size(); i++) {
        visi = test(another.get(i));
        myList.add(visi);
    }
    return myList;
}

所以我定义了一个与another 列表中的元素数量相匹配的线程数组。要在循环中使用这些线程中的每一个,然后在所有线程都执行完毕后返回myList,这就是我迷路的地方。

【问题讨论】:

  • 两件事:首先,您不应该为每个元素都创建新线程。如果您列出了 1000 个元素,您的应用程序将花费更多时间等待操作系统安排所有这些线程,然后再执行实际操作。其次,如果您的线程将元素添加到同一个集合中,那么该集合必须是线程安全的。所以两个最常见的选择:使用 parallelStream 或通过 ExecutorService 使用线程池

标签: java multithreading java-threads


【解决方案1】:

这看起来像是 Stream.parallelStream() 的完美用例

public List<MyList> threaded(List<Another> another) {
    return another.parallelStream()
                  .map(a -> test(a));
                  .collect(Collectors.toList());
}

这将在每个 Another 上调用 test 并使用尽可能多的 CPU 将结果收集为列表(不超过您拥有的对象数量)

是的,您可以为每个线程创建一个线程,但这样做效率较低且复杂得多。

【讨论】:

  • .map(this::test)
  • @MCEmperor 如果方法不是static +1那就更好了
  • 请注意,您需要检查您的线程池:baeldung.com/java-8-parallel-streams-custom-threadpool 的线程数。
  • @Yuri 如果任务是 CPU 密集型的,线程数可能是最佳的。
  • 我指的是这个要求:“我想为每个元素创建一个线程,但我很难弄清楚如何做到这一点。”
猜你喜欢
  • 2011-08-20
  • 2013-11-07
  • 2017-06-13
  • 2013-02-24
  • 1970-01-01
  • 2021-02-23
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多