728x90
public interface Spliterator<T>
ForkJoinFramwork에서 사용되는 인터페이스라, 이번 기회에 공부해보려고 한다.
Spliterator는 8버전에서 새롭게 소개된 인터페이스다.
소스의 원소를 traverse 하고 partition 하기 위한 인터페이스다.
이름에서 알수 있다 싶이, Stream안에서만 사용된다.
* An object for traversing and partitioning elements of a source. The source
* of elements covered by a Spliterator could be, for example, an array, a
* {@link Collection}, an IO channel, or a generator function.
*
public interface Spliterator<T> {
boolean tryAdvance(Consumer<T> action);
default void forEachRemaining(Consumer<T> action);
Spliterator<T> trySplit();
long estimateSize();
int characteristics();
}
메서드 목록 :
- tryAdvance
- spliterator의 원소를 consume할 때 사용된다.
- 이 메서드는 처리할 element가 있으면 true를 리턴하고, 모든 element들이 처리되면 false를 리턴한다.
- forEachRemaning
- 더이상 splitting이 필요하지 않을때 특정 action을 하는 함수이다.
- 기본적으로 각 남아있는 Element에 따라 action을 취할 수 있고, 다 처리될 때 까지 현재 스레드에서 sequential하게 처리된다
- 디폴트로 구현된 메소드를 살펴보면 번복적으로 tryAdvance를 호출하여, spliterator 원소를 시퀀셜 하게 처리한다.
- spliting을 수행하는 동안, spiliterator는 시퀀셜하게 처리해도 될 정도로 원소의 수가 줄어들면, forEachRemaing 메소드를 통해 시퀀셜 하게 처리한다.
default void forEachRemaining(Consumer<T> action) {
do {
} while (tryAdvance(action));
}
- trySplit
- 일부 요소를 두개의 spliterator로 쪼개서, 병렬적으로 두개의 spliterator를 실행할 수 있도록 한다.
- 병렬처리를 균형있게 처리하기 위해서 위와 같이 실행한다.
- 이러한 spliterators는 반복적으로 null를 리턴하지 않고 spliting 프로세스가 끝나기 전까지 trysplit 메서드를 호출한다.
- estimateSize
- Spliterator에서 처리할 수 있는 element의 추정치를 반환함. 일반적으로 이 메서드는 trySplit을 호출하기 전에 크기를 확인하기 위해 AbstractTask와 같은 일부 forkjoin 작업에 의해 호출된다.
- characteristics :
- structure의 특징을 보고하는 메서드이다.
- Spliterator가 계산을 쉽게 할 수 있도록 도와준다.
- ORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT, and SUBSIZED의 값을 가질 수 있다.
결론 :
Parallel stream은 ForkJoinPoll과 Spliterator를 이용하여 동시에 원소를 처리한다.
하지만 시퀀셜한 처리의 실행시간과 비교 후에 병렬 스트림을 사용하는 것이 현명한 선택이다.
예를 들어 1,000,000 개를 처리할 때 병렬로 처리하는 게 유의미 할 수 있는데, 5000개 정도이면 병렬 스트림은 오버헤드도 있기 때문에 스퀀셜한 처리가 빠를 수 있다.
https://java-8-tips.readthedocs.io/en/stable/parallelization.html#spliterator
출처
https://java-8-tips.readthedocs.io/en/stable/parallelization.html
'개발 > Java' 카테고리의 다른 글
BigInteger, BigDecimal 클래스 (0) | 2021.05.17 |
---|---|
JVM String Constant Pool (0) | 2021.05.17 |
non-reifiable 타입이란 (0) | 2021.05.17 |
Java Datagram 관련 클래스 (0) | 2021.05.17 |
자바 Socket 클래스 (0) | 2021.05.17 |