2012-07-16 28 views
1

可能重複:
「Parallel.For」 for Java?Parallel.For在Java中?

.NET具有的Parallel.For它可以讓你在並行而不必直接玩弄線程運行一個循環。

Details are here

有沒有在Java中類似的東西?我發現了完全相同的問題(Here),但有人問之前的Java的最新版本出來了,號稱有:

「JSR 166併發工具」

所以,他們才裝上去?

+2

我相信你的問題已經回答[這裏](http://stackoverflow.com/a/4010275/1221734)。 – gkaran89 2012-07-16 18:29:04

+0

我找到了這個問題。我與它聯繫在一起。我想知道是否有官方的東西。 – Haedrian 2012-07-16 18:30:07

+0

@MarkByers - 我已經說過了。我把這個問題和那個問題聯繫在一起。我問他們是否在Java 1.7中放置了某些東西 - 這是發生在該帖子和現在之間的東西。 – Haedrian 2012-07-16 18:30:55

回答

1

fork/join框架應包括與Java 8,用lambda表達式/關閉一起......就在最近,有對安格蘭格,Java的冠軍

1

我的並行計算教授一個主題一個很好的演講,艾倫卡明斯基(Alan Kaminsky)和他的一羣研究生寫了一個有你需要的功能的圖書館。

Javadocs,許可證,下載,甚至是免費的書都包含在信息頁面上。

這是自由軟件的GNU GPL版本3

Parallel Java 2 Library

3

下,雖然可以認爲是的Parallel.For對simular 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 

如果你認爲在可運行的代碼不是線程安全的,我懷疑的Parallel.For做一些事情,而不同或者它毫無意義。