Stream에서 병렬 스트림 파이브라인도 공통의 ForkJoinPool.commonPool 에서 수행한다고 하는 데 정확한 설명은?

MinJee Lee·2022년 5월 13일
0

Java

목록 보기
10/10
post-thumbnail

ForkJoinPool의 동작방식

Parallel Stream 에서 사용되는 ForkjoinPool은 Java7에서 등장하였고 , fork를 통해 수행해야할 Task를 분할 하고, 분할된 Task의 결과를 join을 통해 합치는 방식으로 동작한다.

위에 API에서 본 것 같이 ForkJoinPool은 AbstractExecutorService에 대한 구현체이다.

밑의 그림은 분할 - 정복 알고리즘 방식과 비슷하게 동작하는 ForkJoinPool의 모습이다.

ForkJoinPool.class

ForkJoinPool은 스레드 마다 개별(Queue)를 가지며, 만약 하나의 스레드가 가진 Task가 없으면 Task가 있는 스레드의 Task 를 가져와 처리하여 CPU 자원 낭비를 줄이고 성능을 향상시켰다.

ForkJoinPool Thread 동작 방식

commonPool 메서드 API

공통의 인스턴스 풀을 반환한다. 이 풀은 정적으로 생성되며, 실행 상태는 shutdown() 또는 shutdownNow() 시도에 영향을 받지 않는다. 그러나 이 풀과 진행 중인 모든 처리는 System.exit(int) 프로그램에서 자동으로 종료된다. 프로그램 종료 전에 완료하기 위해 비동식 작업 처리에 의존하는 모든 프로그램은 종료하기 전에 common.Pool().waitQuieness를 호출 해야한다.

import java.util.List;  
import java.util.concurrent.ForkJoinPool;  
import java.util.concurrent.RecursiveAction;  
 class Task4 extends RecursiveAction {  
     private long Load = 0;  
 public Task4(long Load) {  
         this.Load = Load;  
    }  
    @Override  
    protected void compute() {  
        //if work is above threshold, break tasks up into smaller tasks  
            List<Task4> subtasks = new ArrayList<Task4>();  
                subtasks.addAll(createSubtasks());  
            for(RecursiveAction subtask : subtasks){  
                subtask.fork();  
            }  
    }  
    private List<Task4> createSubtasks() {  
        List<Task4> subtasks =new ArrayList<Task4>();  
     Task4 subtask1 = new Task4(this.Load / 2);  
     Task4 subtask2 = new Task4(this.Load / 2);  
      Task4 subtask3 = new Task4(this.Load / 2);  
        subtasks.add(subtask1);  
        subtasks.add(subtask2);  
        subtasks.add(subtask3);  
  
        return subtasks;  
    }  
}  
public class JavaForkJoincommonPoolExample1 {  
   public static void main(final String[] arguments) throws InterruptedException  
      {        
      int proc = Runtime.getRuntime().availableProcessors();  
      System.out.println("numbers of core available in your processor:"  +proc);  
      ForkJoinPool Pool = ForkJoinPool.commonPool();  
      int i= Pool.getPoolSize();  
      System.out.println("Common Pool Size before  :" +i);  
       Task4 t = new Task4(400);  
       Pool.invoke(t);  
        i= Pool.getPoolSize();  
      System.out.println("Common Pool Size after  :" +i);  
   }    
}

출력결과

numbers of core available in your processor:4
Common Pool Size before :0
Common Pool Size after :3

출처 : https://www.baeldung.com/java-8-parallel-streams-custom-threadpool

https://velog.io/@heoseungyeon/병렬-데이터-처리와-성능

https://hamait.tistory.com/612

https://willbfine.tistory.com/469

https://stackoverflow.com/questions/33694908/is-forkjoinpool-commonpool-equivalent-to-no-pool

https://www.javatpoint.com/java-forkjoinpool-commonpool-method

0개의 댓글