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
'Language > Java' 카테고리의 다른 글
컬렉션 API 개선 - modern java in action (0) | 2024.06.18 |
---|---|
멀티 쓰레드 이용 - 자바 달력 시간 변경 코드 (0) | 2023.12.06 |
스트림 Stream 을 사용하는 이유 - Modern Java in Action (2) | 2023.10.02 |
Modern Java in Action - Reviews(모던 자바 인 액션 - 리뷰) (0) | 2023.10.02 |
ArrayList 와 LinkedList 의 차이점 (0) | 2023.05.12 |