并行化 for 循环
2022-09-01 18:20:27
我有一个for循环,其中迭代时的计算不依赖于先前迭代中完成的计算。i
我想并行化循环(我的代码是java),以便多个迭代的计算可以在多个处理器上同时运行。我是否应该为每次迭代的计算创建一个线程,即要创建的线程数等于迭代次数(for 循环中的迭代次数很大)?如何做到这一点?for
我有一个for循环,其中迭代时的计算不依赖于先前迭代中完成的计算。i
我想并行化循环(我的代码是java),以便多个迭代的计算可以在多个处理器上同时运行。我是否应该为每次迭代的计算创建一个线程,即要创建的线程数等于迭代次数(for 循环中的迭代次数很大)?如何做到这一点?for
下面是一个小示例,你可能会发现它有助于开始并行化。它假设:
Input
Output
如果您的计算非常简单,那么您可能需要考虑批量处理它们。您可以通过在每个输入中放入100来做到这一点。它使用与系统中处理器一样多的线程。如果您正在处理纯粹的CPU密集型任务,那么这可能是您想要的数字。如果他们被阻止等待其他内容(磁盘,网络,数据库等),您可能希望走得更高。
public List<Output> processInputs(List<Input> inputs)
throws InterruptedException, ExecutionException {
int threads = Runtime.getRuntime().availableProcessors();
ExecutorService service = Executors.newFixedThreadPool(threads);
List<Future<Output>> futures = new ArrayList<Future<Output>>();
for (final Input input : inputs) {
Callable<Output> callable = new Callable<Output>() {
public Output call() throws Exception {
Output output = new Output();
// process your input here and compute the output
return output;
}
};
futures.add(service.submit(callable));
}
service.shutdown();
List<Output> outputs = new ArrayList<Output>();
for (Future<Output> future : futures) {
outputs.add(future.get());
}
return outputs;
}
不应手动执行线程处理。相反:
Future
Future