gpt4 book ai didi

java - 如何使用多线程使慢速 "for loop"更快?

转载 作者:行者123 更新时间:2023-12-05 01:02:02 30 4
gpt4 key购买 nike

假设我有一个非常缓慢和大的 for 循环。

如何将其拆分为多个线程以使其运行速度更快?

for (int a = 0; a < 30_000_000; a++) {
for (int b = 0; b < 30_000_000; b++) {
for (int c = 0; c < 30_000_000; c++) {
slowMethod();
}
}
}

最佳答案

这有点宽泛,但使用 ExecutorService当处理器编号大于 1 和 slowMethod 时,固定线程编号将使其更快是独立的。如果slowMethod是 I/O 密集型,您可以增加线程数以获得更高的性能。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors() + 1);

for (int a = 0; a < 30000000; a++) {
for (int b = 0; b < 30000000; b++) {
for (int c = 0; c < 30000000; c++) {
final int a_copy = a;
final int b_copy = b;
final int c_copy = c;
service.execute(() -> {
slowMethod(a_copy, b_copy, c_copy);
});
}
}
}
}

public static void slowMethod(int a, int b, int c) {

}
}

更新

如评论中所述,由于队列的容量为 Integer.MAX_VALUE,因此可能会导致任务中止。 .可以让主线程执行 slowMethod当队列已满时。为此,您需要手动创建池:
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
int threads = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor executor = new ThreadPoolExecutor(threads, threads,
0, TimeUnit.MILLISECONDS,
queue, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());

关于java - 如何使用多线程使慢速 "for loop"更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50201888/

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