2017-04-06 1 views
2

많은 수의 반복에 대해 0부터 9까지의 임의의 정수에서 1의 수를 계산하는 간단한 프로그램이있는 경우 sum 함수를 사용하여 1의 (numOnes)를 계산하는 변수를 어떻게 줄일 수 있습니까? 나중에 내 프로그램에서 총계를 사용할 수 있어야합니다.Java 스레드에서 reduce 함수를 적용하는 방법은 무엇입니까?

이것은 OpenMP의 감소 지시문과 동일합니다.

public void run() { 

    long work = total_iterations/threads; 
    long numOnes = 0; 

    for (long i = 0; i < work; i++) { 
    int randomNum = rand.nextInt(9); 

    if (randomNum == 1) { 
     numOnes += 1; 
    } 
    } 
} 

각 스레드가 실행 완료되면 집계 결과가 포함 된 numOnes를 사용할 수 있기를 원합니다.

답변

0

자바에서는 수동으로 앉아서 관리해야합니다. 즉, 데이터가 분할되었다고 가정하면이 10 개의 스레드를 걷어 차서 작업을 수행 할 수 있습니다.

결국, 당신은 join 모든 스레드를 원합니다; 모든 스레드가 "결합"된 경우에만; 그들 모두는 행해진 다. 당신은 그 결과를 처리하고 진행할 준비가되어 있습니다.

또는 ExecutorService 및 Futures와 같은 "추상"항목을 살펴보아야합니다. "베어 메탈"스레드를 직접 다루지 않아도됩니다.

물론 꽤 일반적입니다. 그러나 잘, 당신의 질문입니다.

+0

나는 모든 스레드를 기다립니다 가입이 완료 이해하지만 어떻게 구체적으로 당신은 스레드에 가입 한 후 모든 지역 변수 numOnes을 요약 것인가? – arvarik

+0

빠른 승인을 보내 주셔서 감사합니다. 귀하의 의견에 관해서 : ExecutorService를 공부할 수 있다고합니다. 그 하나는 Runnable 인스턴스뿐만 아니라 호출 가능한 인스턴스도 전달할 수 있습니다. 그리고 그것들은 예를 들어 가치를 반환 할 수 있습니다! 더 많은 질문이있을 때 알려주십시오. – GhostCat

0

여기에 스트림을 사용할 수 있습니다.

public class ParallelInts 
{ 
    public static void main(String[] args) { 
     int count = new Random().ints(1_000_000, 0, 10).parallel() 
       .reduce(0, (sum, i) -> sum + ((i==1)?1:0)); 
     System.out.println("count = " + count); 
    } 
} 
관련 문제