우선 스트림에 대해서 알아야 할 것 같다.
스트림 :
자바8 에 추가된 API 로 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다.
여기서 선언형은 데이터를 처리하는 임시 구현 코드 대신 질의로 표현할 수 있는 것이다.
Java In Action 에서는 이 스트림 API를 이용하면 멀티 스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다고 한다. 투명하게란 말은 부작용이 없다는 뜻인 것 같다.
코드로 살펴보자.
public class Test {
public static void main(String[] args) {
List<Integer> numberList = Arrays.asList(5, 3, 2, 1, 4, 8, 7, 6, 10, 9);
List<Integer> resultList = new ArrayList<Integer>();
for (Integer temp : numberList) {
if (temp < 7) {
resultList.add(temp);
}
}
System.out.println("resultList 정렬 전 : "+resultList.toString());
Collections.sort(resultList, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
});
System.out.println("resultList 정렬 후 : "+resultList.toString());
}
}
// resultList 정렬 전 : [5, 3, 2, 1, 4, 6]
// resultList 정렬 후 : [1, 2, 3, 4, 5, 6]
다음과 같이 코드를 작성하는 건 Java 7 당시의 코드라고 한다. 한 눈에 보아도 코드가 길고, 길고, 길다.
그러면 Java 8 에 있다는 스트림 API 를 사용하면 어떻게 될까? 나도 궁그미
public static void main(String[] args) {
List<Integer> numberList = Arrays.asList(5, 3, 2, 1, 4, 8, 7, 6, 10, 9);
List<Integer> resultList = numberList.stream()
.filter(d -> d < 7)
.sorted(Comparator.comparing(Integer::intValue))
.collect(Collectors.toList());
System.out.println("resultList 정렬 후 : "+resultList.toString());
}
//
resultList 정렬 후 : [1, 2, 3, 4, 5, 6]
정달 대-단한 코드다. 무척이나 깔끔해진 코드이다.
여기서 .stream() 을 .parallelStream() 으로 바꾸면 멀티코어 아키텍처에서 병렬로 실행할 수 있다고 한다.
parallel 메소드에서 병렬로 작업을 수행하는 스레드는 내부적으로 ForkJoinPool을 사용하는데, 여기서 ForkJoinPool은 프로세서 수, 즉 Runtime.getRuntime().availableProcessors() 가 반환하는 값에 상응하는 스레드를 갖는다고 한다.
반응형