본문 바로가기

java

[자바 병렬 처리 - 포크/ 조인 프레임 워크]

포크/ 조인 프레임워크는 병렬처리를 위한 프레임워크로

java.util.concurrent 패키지의 핵심인 ExecutorService 인터페이스를 구현한 클래스.

코드에 대한 멀티 스레드 처리가 가능하다.

 

포크/ 조인 프레임워크의 동작을 확인하면 아래와 같다.

 

포크(Fork) : 다른 프로세스 혹은 스레트(테스크태스크)를 여러 개로 쪼개서 새롭게 생성

조인(Join) : 포크해서 실행한 프로세스 혹은 스레드(태스크)의 결과를 취합한다.

 

일을 나눌 수 있다면 여러개로 쪼개서 실행(포크), 하고 최종적으로 실행이 완료된 내용을(조인)해서 결과를 만들어 낸다.

분할 정복 같은 느낌!

 

black9p.github.io/2018/01/20/%EB%B3%91%EB%A0%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B2%98%EB%A6%AC%EC%99%80-%EC%84%B1%EB%8A%A5/

 

병렬 데이터 처리와 성능

병렬 스트림 이란, 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다.병렬 스트림을 이용하면 모든 멀티코어 프로세서가 각각의 청크를 처리하도록 할당할 수

black9p.github.io

 

포크/ 조인 프레임워크의 대표적인 클래스는 다음과 같다

 

  • ForkJoinPool
  • ForkJoinTask
  • RecurciveTask  *아래 설명할 클래스
  • RecursiveAction

 

* RecurciveTask 를 사용할때 병렬 처리를 할것인지 판단은 본인이 내려야 하는데

그 구조를 수도 코드로 작성하면 아래와 같다.

if (하위 작업으로 분리 할 수 있는지 판단) {


  하위 작업으로 분리, 


  재귀 호출 


}


else{


  태스크 실행


}

 

더 자세한 코드에 대한 설명,

 

docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveTask.html

 

RecursiveTask (Java Platform SE 8 )

A recursive result-bearing ForkJoinTask. For a classic example, here is a task computing Fibonacci numbers: class Fibonacci extends RecursiveTask { final int n; Fibonacci(int n) { this.n = n; } Integer compute() { if (n <= 1) return n; Fibonacci f1 = new F

docs.oracle.com

 

위 방식은 포크/조인 프레임 워크를 사용하지 않고 그냥 재귀호출로 구현할수 있지만

재귀호출은 멀티 스레드가 아닌 순차 처리가 때문에 되기 때문에 시간이 더 소요되며 CPU 사용률 더 떨어진다.

하지만 반대로 잘못 사용하게 되면 자원을 많이 소모하여 처리속도가 더 떨어질 수 있다.

 

 

 

 

 

출처:

book.naver.com/bookdb/book_detail.nhn?bid=16686472

 

Practical 모던 자바

어렵게만 느껴지던 자바의 신기능을 쉽고 빠르게 익힌다!자바는 발표된 지 25년이 지났지만 시대의 변화에 맞춰 계속 새로운 기능을 도입하며 발전하고 있다. 특히 자바 8 이후 버전에서는 기존

book.naver.com

 

반응형