2012-07-16 47 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做一些事情,而不同或者它毫无意义。