개발/Java

Spliterator란

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의 값을 가질 수 있다.

 

 

 

Spiliterator의 Workflow

 

결론 : 

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