Fork/Join을 이용한 스레드 연산(작성중)

ISAAC·2021년 1월 8일
0

자바 프로그램을 실행하면 하나의 프로세스가 동작하고, 그 프로세스는 하나 이상의 스레드로 이루어진다. 이 스레드를 더욱 효율적으로 사용하기 위한 클래스를 소개해 보겠다. 그 시작은 Fork/Join을 이해하는 것이다.

Fork(나누고)/Join(모으고)

Fork는 여러 개를 나누는 작업을 말하고, Join은 작업 결과를 모으는 것이라고 생각하면 된다.

여기서 나아가 Work Stealing이라는 개념도 들어가는데,

Work Stealing

여러 개의 Dequeue에 작업이 나뉘어져 어떤 일이 진행될 때 만약 하나의 Dequeue는 바쁘고, 다른 Dequeue는 바쁘지 않을 때가 있다. 이럴 경우 할 일이 없는 Dequeue가 바쁜 Dequeue에 대기하고 있는 일을 가져가서 해 주는 것이라고 생각하면 된다.
(※참고 : 입구와 출구가 정해져 있는 Queue와는 달리, Dequeue는 양쪽 끝이 모두 입구와 출구가 되는 구조이다.)

이같은 Work Stealing이 Fork/Join에 기본적으로 포함돼 있다.

기본적인 수행 개념은 다음과 같다.

if(작업 단위가 충분히 작을 경우){
    해당작업 수행
}else{
    작업을 반으로 쪼개어 두 개 작업으로 나눔.
    두 작업을 동시에 실행, 두 작업 끝날 때까지 결과를 기다림
}

보통 이 연산은 회귀적(Recursive)으로 수행된다.

Fork/Join을 사용하는 클래스

ForkJoinPool을 사용하려면 기본적으로 알아야 할 클래스들이 있다.

  • ForkJoinPool

    • fork-join방식으로 타스크를 생성하고 동작시키는 ForkJoin Framework의 모체
  • RecursiveTask

    • 실제 작업의 단위가 되는 클래스는 이 클래스를 상속해야 한다. 또한 compute메소드에서 결과값을 리턴해야 한다.
  • RecursiveAction

    • RecursiveTask과 같은 용도로서, 작업의 단위가 되는 클래스가 상속해야 하는 클래스이다. 결과는 리턴하지 않는다.
  • ForkJoinTask

    • RecursiveTask의 부모클래스스로서 fork와 join메소드가 정의되어있다. 직접적으로 사용하지는 않는다.
profile
어려운 것은 쉽게, 쉬운 것은 기억에 남게.

0개의 댓글