728x90

병렬(parallel) 처리란 한가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리하는 것을 말한다.

병렬 처리 스트림을 이용하면 런타임 시 하나의 작업을 서브 작업으로 자동으로 나누고, 서브 작업의 결과를 자동으로 결합해서 최종 결과물을 생성한다. 

예를 들어 컬렉션의 요소 총합을 구할 때 순차 처리 스트림은 하나의 스레드가 요소들을 순차적으로 읽어 합을 구하지만, 병렬 처리 스트림을 이용하면 여러 개의 스레드가 요소들을 부분적으로 합하고 이 부분합을 최종 결합해서 전체 합을 생성합니다. 

 

다음 예제를 보시면 순차 처리 스트림과 병렬 처리 스트림을 이용하여 사용된 스레드의 이름이 무엇인지 콘솔에 출력하여 보여드리겠습니다.

 

public class parallel {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("홍길동","신지","카카와","박지성","손흥민");

        //순차 처리
        Stream<String> stream = list.stream();
        stream.forEach(parallel :: print);
        // 메소드 참조(s -> ParallelExample.print(s)와 동일)

        System.out.println();

        //병렬처리
        Stream<String> parallelStream = list.parallelStream();
        parallelStream.forEach(parallel :: print);
    }
    public static void print(String str){
        System.out.println(str +" : " +Thread.currentThread().getName());
    }
}

실행 결과 

위에 값은 순차 처리 // 밑에 값은 병렬처리


스트림은 중간 처리와 최종 처리를 할 수 있다. 

 

스트림은 컬렉션의 요소에 대해 중간 처리와 최종 처리를 수행할 수 있는데, 중간 처리에서는 매핑, 필터링, 정렬을 수행하고 최종 처리에서는 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행한다. 

 

 -->  ||  ||  || --> 

컬렌션 배열 --> 오리지날 스트림 필터링처리 중간 스트림 매핑 처리 중간 스트림 집계처리 결과물  -->

예를 들어 학새 ㅇ객체를 요소에 가지는 컬랙션이 있다고 가정하면 중간 처리에서는 학생의 점수를 뽑아내고, 최종에서는 점수의 평균값을 산출한다.

 

다음 예제는 List 에 저장되어 있는 student 객체를 중간 처리에서 score 필드값으로 매핑하고, 최종 처리에서 score 의 평균값을 산출한다.

import java.util.Arrays;
import java.util.List;


public class MapAndReduceExample {
    public static void main(String[] args) {
        List<Student> studentList = Arrays.asList(
                new Student("홍길동",10),
                new Student("신용권",20),
                new Student("유미선",30)

                );
        double avg = studentList.stream()
        // 중간처리(학생 객체를 점수로 매핑)
                .mapToInt(Student :: getScore)
                //최종 처리(평균점수)
                .average()
                .getAsDouble();
        System.out.println("평균 점수 : " + avg);
    }
}
public class Student {

    private String name;
    private int score;
    public Student (String name, int score){
        this.name = name;
        this.score = score;
    }
    public String getName(){return name;}
    public int getScore(){return score;}
}

평균 점수 :20.0

728x90
복사했습니다!