1

重複の可能性:
Java の「Parallel.For」?

.NET には Parallel.For があり、スレッドを直接操作しなくても for ループを並列に実行できます。

詳細はこちら

Javaに似たようなものはありますか?まったく同じ質問 (ここ) を見つけましたが、Java の最新バージョンがリリースされる前に尋ねられました。

「JSR 166 での同時実行ユーティリティ」

それで、彼らは何かを入れましたか?

4

3 に答える 3

3

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 はかなり異なることを行っているか、かなり無意味なことをしているのではないかと思います。

于 2012-07-16T18:50:13.983 に答える
1

Fork/Join Framework は、ラムダ/クロージャと共に Java 8 に含める必要があります... つい最近、Java チャンピオンの 1 人である Angelika Langer によるこのテーマに関する良いスピーチがありました。

于 2012-07-16T18:34:01.220 に答える
1

私の並列コンピューティングの教授である Alan Kaminsky と彼の大学院生の群れは、必要な機能を備えたライブラリを作成しました。

Javadoc、ライセンス、ダウンロード、さらには無料の書籍まで、すべて情報ページに掲載されています。

GNU GPL バージョン 3 の下のフリー ソフトウェアです。

並列 Java 2 ライブラリ

于 2012-07-16T18:34:09.707 に答える