2012-07-16 2 views
1

가능한 중복 :
“Parallel.For” for Java?Java에서 Parallel.For?

.NET은 직접 스레드 함께 놀러하지 않고 병렬 루프를 실행할 수 있습니다 Parallel.For 있습니다.

Details are here

는 자바에서 비슷한 일이 있습니까?

"동시성 유틸리티 JSR 166에서"

그래서, 그들은 뭔가를 넣어했다 : 나는 자바의 최신 버전이 있다고 주장하는 나왔다 전에 그러나 그것은 질문을 받았다, 동일한 질문 (Here를) 발견 ?

+2

나는 귀하의 질문에 대한 답변을 [here] (http://stackoverflow.com/a/4010275/1221734) 믿습니다. – gkaran89

+0

나는 그 질문을 제기했다. 나는 그것에 연결했다. 나는 공식적인 것이 있는지 궁금 하네. – Haedrian

+0

@MarkByers - 이미 말했어. 저도 똑같은 질문에 연결되어 있습니다. Java 1.7에서 뭔가를 넣었는지 물어볼 것입니다. – Haedrian

답변

1

는 포크/가입 프레임 워크는 람다/폐쇄와 함께 ... 최근 안젤리카 랑거, 자바 챔피언스

1

내 병렬 컴퓨팅 교수의 하나 그 주제에 대한 좋은 연설이 있었다, 자바 (8)에 포함되어야한다 앨런 카민스키 (Alan Kaminsky)와 그의 무리의 대학원생은 필요한 기능을 갖춘 도서관을 작성했습니다.

Javadocs, 라이센스, 다운로드 및 무료 도서까지 모두 정보 페이지에서 다룹니다. 이 Parallel.For는 ExecutorService.submit에 시뮬 것을 제안 할 수 있지만

그것은 자유 소프트웨어는 GNU GPL 버전 3

Parallel Java 2 Library

3

에서, 난 그렇지 생각한다.

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 오히려 다른 무언가를 의심 또는 그것의 꽤 무의미한.