当前位置: 首页 > 面试题库 >

Java的“ Parallel.For”吗?

利海阳
2023-03-14
问题内容

我想知道是否有Parallel.For等效于Java的.net版本?

如果有人可以提供示例?谢谢!


问题答案:

我猜最接近的是:

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();

编辑:决定添加一个基本的“ Parallel.For”实现

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

编辑
如果有人有兴趣,我将其放在GitHub上。在GitHub上并行



 类似资料:
  • 本文向大家介绍c#语言Parallel.For,包括了c#语言Parallel.For的使用技巧和注意事项,需要的朋友参考一下 示例 一个使用Parallel.For循环对网站网址的给定数组执行ping操作的示例。            

  • 问题内容: 我有一类范围 如果我使用正常的工作原理是完美的,但是必须等待每个命令完成并且每个查询需要8秒钟,所以10个查询需要80秒钟。 在并行版本中,如果仅打印范围,则效果很好,但如果尝试执行命令,则说明该过程已在进行中。 {“操作已经在进行中。”} 我该如何解决? 问题答案: Npgsql连接不能同时使用-在任何给定时间点只能运行一个命令(换句话说,没有MARS支持)。 打开多个连接以并行执行

  • 问题内容: 我需要从Java调用CPython代码。有哪些工具/ API /库可以帮助我做到这一点? Jython不是一个选择,因为Python代码严重依赖。 编辑1:该函数应该是Java,而不是Python(即,我需要将CPython嵌入Java中,反之亦然。) 编辑2:我还应该提到,我将在Java和Python之间传递大型数值数组,因此,最好将两者合并到同一进程空间中的解决方案(但不是强制性的

  • 问题内容: 已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 Java 因其速度慢而享有一定的声誉。 Java真的很慢吗? 如果是,为什么?瓶颈在哪里?是因为JVM效率低下吗?垃圾收集?纯字节码库而不是JNI包装的C代码?许多其他语言都具有这些功能,但是它们并没有因速度慢而享有盛誉。 问题答案: 现代Java是最快的语言之一,即使它仍然是内存消耗大的

  • 问题内容: 我的问题可能太广泛了,答案可能是简单的“否”,但我不得不问。 Java 7中有(Java 8)流 *的等效实现吗? 我熟悉(Java 8)流,但是我的项目要求是使用Java 7。 *不要与inputStream和outputStream混淆。 问题答案: 在官方API中,没有。 Java 7没有更多的公共更新。如果您是客户,您可能仍然会获得较小的更新,但是对于反向移植Stream AP

  • 问题内容: 基本上,我希望每10毫秒调用一次函数。 如何在Java中实现? 问题答案: 您可能想看看Timer。