gpt4 book ai didi

java - 使用多线程并行化 Java 中的 for 循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:54:49 24 4
gpt4 key购买 nike

我是 java 的新手,我想使用执行程序服务或使用 java 中的任何其他方法并行化嵌套的 for 循环。我想创建一些固定数量的线程,这样 CPU 就不会完全被线程占用。

    for(SellerNames sellerNames : sellerDataList) {
for(String selleName : sellerNames) {
//getSellerAddress(sellerName)
//parallize this task
}
}

sellerDataList 的大小 = 1000,sellerNames 的大小 = 5000。

现在我想创建 10 个线程并将相同的任务分配给每个线程。这是针对第 i 个 sellerDataList,第一个线程应该获取 500 个名称的地址,第二个线程应该获取下一个 500 个名称的地址,依此类推。
完成这项工作的最佳方式是什么?

最佳答案

有两种方法可以使其并行运行:Streams 和 Executors。

使用流

你可以使用并行流,剩下的交给jvm。在这种情况下,您对何时发生的事情没有太多控制权。另一方面,您的代码将易于阅读和维护:

    sellerDataList.stream().forEach(sellerNames -> {
Stream<String> stream = StreamSupport.stream(sellerNames.spliterator(), true); // true means use parallel stream
stream.forEach(sellerName -> {
getSellerAddress(sellerName);
});
});

使用 ExecutorService

假设您需要 5 个线程,并且希望能够等到任务完成。然后,您可以使用具有 5 个线程的固定线程池并使用 Future-s,这样您就可以等到它们完成。

    final ExecutorService executor = Executors.newFixedThreadPool(5); // it's just an arbitrary number
final List<Future<?>> futures = new ArrayList<>();
for (SellerNames sellerNames : sellerDataList) {
for (final String sellerName : sellerNames) {
Future<?> future = executor.submit(() -> {
getSellerAddress(sellerName);
});
futures.add(future);
}
}
try {
for (Future<?> future : futures) {
future.get(); // do anything you need, e.g. isDone(), ...
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}

关于java - 使用多线程并行化 Java 中的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43655768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com