java - Parallel.For 在 Java 中?

标签 java parallel-processing

<分区>

Possible Duplicate:
“Parallel.For” for Java?

.NET 具有 Parallel.For,它允许您并行运行 for 循环,而无需直接使用线程。

Details are here

Java 中有类似的东西吗?我发现了完全相同的问题 ( Here ),但是在最新版本的 java 发布之前有人问过这个问题,它声称有:

“JSR 166 下的并发实用程序”

那么,他们有没有放东西进去?

最佳答案

虽然有人认为 Parallel.For 类似于 ExecutorService.submit,但我怀疑它不是。

public static void main(String... args) throws InterruptedException {
    long start1 = System.nanoTime();
    int runs1 = 1000;
    final int[] a = new int[100];
    for (int j = 0; j < runs1; j++) {
        for (int i = 0; i < 100; i++) {
            a[i] = a[i] * a[i];
        }
    }
    long time1 = System.nanoTime() - start1;
    System.out.printf("Each loop took an average of %,d micro-seconds%n", time1 / runs1 / 1000);

    int processors = Runtime.getRuntime().availableProcessors();
    long start2 = System.nanoTime();
    ExecutorService executor = Executors.newFixedThreadPool(processors);
    for (int j = 0; j < runs1; j++) {
        for (int i = 0; i < 100; i++) {
            final int i2 = i;
            executor.submit(new Runnable() {
                public void run() {
                    a[i2] = a[i2] * a[i2];
                }
            });
        }
    }
    executor.shutdown();
    executor.awaitTermination(1, TimeUnit.SECONDS);
    long time2 = System.nanoTime() - start2;
    System.out.printf("Parallel: Each loop took an average of %,d micro-seconds%n", time2 / runs1 / 1000);
}

打印

Each loop took an average of 2 micro-seconds
Parallel: Each loop took an average of 149 micro-seconds

这表明在这个例子中,使用多线程是一个非常糟糕的主意。所以我希望循环是稍微更有效率的

    for (int j = 0; j < runs1; j++) {
        for (int i = 0; i < processors; i++) {
            final int i2 = i;
            executor.submit(new Runnable() {
                public void run() {
                    for (int i3 = i2 * 100 / processors; i3 < (i2 + 1) * 100 / processors && i3 < 100; i3++)
                        a[i2] = a[i2] * a[i2];
                }
            });
        }
    }

打印

Parallel: Each loop took an average of 28 micro-seconds

如果您认为 Runnable 中的代码不是线程安全的,我怀疑 Parallel.For 做了一些相当不同的事情或者它毫无意义。

关于java - Parallel.For 在 Java 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11510254/

相关文章:

c# - 不使用 EF4.1 和 Automapper 的并行

java - JUNIT - 断言异常

java - 如何调整 Java InputStream 的大小

java - 将多个 ObservableList 合并为一个 List

windows - 您知道任何对并行化有良好支持的构建系统吗?

java - 如何通过 Springboot 服务的 2 个实例从共享位置并行访问文件?

java - Android BaseAdapter 仅显示一次正确信息

web 文件夹外的 Java Servlet 绝对路径 [ Windows & Linux ]

c - 具有包含动态分配数组的自定义数据类型的 MPI_reduce() : segmentation fault

java - 如果两个线程使用不同的监视器,它们是否可以在同一个对象上执行相同的同步代码块?