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