“Parallel.For"为Java? [英] "Parallel.For" for Java?
问题描述
我想知道是否有一个 Parallel.For 相当于Java 的 .net 版本?
I was wondering if there is a Parallel.For equivalent to the .net version for Java?
如果有人可以提供一个例子吗?谢谢!
If there is could someone please supply an example? thanks!
推荐答案
我想最接近的应该是:
ExecutorService exec = Executors.newFixedThreadPool(SOME_NUM_OF_THREADS);
try {
for (final Object o : list) {
exec.submit(new Runnable() {
@Override
public void run() {
// do stuff with o.
}
});
}
} finally {
exec.shutdown();
}
根据 TheLQ 的评论,您可以将 SUM_NUM_THREADS 设置为 Runtime.getRuntime().availableProcessors();
Based on TheLQ's comments, you would set SUM_NUM_THREADS to Runtime.getRuntime().availableProcessors();
决定添加一个基本的Parallel.For"实现
Decided to add a basic "Parallel.For" implementation
public class Parallel {
private static final int NUM_CORES = Runtime.getRuntime().availableProcessors();
private static final ExecutorService forPool = Executors.newFixedThreadPool(NUM_CORES * 2, new NamedThreadFactory("Parallel.For"));
public static <T> void For(final Iterable<T> elements, final Operation<T> operation) {
try {
// invokeAll blocks for us until all submitted tasks in the call complete
forPool.invokeAll(createCallables(elements, operation));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static <T> Collection<Callable<Void>> createCallables(final Iterable<T> elements, final Operation<T> operation) {
List<Callable<Void>> callables = new LinkedList<Callable<Void>>();
for (final T elem : elements) {
callables.add(new Callable<Void>() {
@Override
public Void call() {
operation.perform(elem);
return null;
}
});
}
return callables;
}
public static interface Operation<T> {
public void perform(T pParameter);
}
}
Parallel.For 的使用示例
// Collection of items to process in parallel
Collection<Integer> elems = new LinkedList<Integer>();
for (int i = 0; i < 40; ++i) {
elems.add(i);
}
Parallel.For(elems,
// The operation to perform with each item
new Parallel.Operation<Integer>() {
public void perform(Integer param) {
System.out.println(param);
};
});
我想这个实现真的更类似于 Parallel.ForEach
I guess this implementation is really more similar to Parallel.ForEach
编辑如果有人感兴趣,我把它放在 GitHub 上.GitHub 上的并行
Edit I put this up on GitHub if anyone is interested. Parallel For on GitHub
这篇关于“Parallel.For"为Java?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!