JAVA/포스팅

자바 쓰레드 fork 프레임웍

짜집퍼박사(짜박) 2023. 11. 22. 00:49

자바에서 "fork/join" 프레임워크는 병렬 프로그래밍을 위한 도구로서, 주로 병렬화된 작업을 효율적으로 처리할 수 있게 해줍니다. 이 프레임워크는 Java 7부터 도입되었습니다. Fork/join 프레임워크의 핵심은 분할 정복(divide and conquer) 알고리즘을 사용하여 작업을 처리하고, 병렬성을 높일 수 있도록 설계되었습니다.

다음은 Fork/join 프레임워크의 주요 구성 요소와 사용 방법에 대한 간단한 설명입니다

 

1. ForkJoinPool 클래스

Fork/join 프레임워크에서는 작업 스레드를 관리하는데에 ForkJoinPool 클래스를 사용합니다. 이 클래스는 일종의 스레드 풀로, 작업을 여러 스레드로 분할하여 실행할 수 있도록 합니다.

 

2. RecursiveTask 및 RecursiveAction 클래스

Fork/join 프레임워크에서 처리되는 작업은 주로 RecursiveTask 또는 RecursiveAction 클래스를 확장하여 구현됩니다.

 

- RecursiveTask : 일반적으로 값을 반환하는 작업에 사용됩니다.

- RecursiveAction : 값을 반환하지 않는 작업에 사용됩니다.

 

3. ForkJoinTask 클래스

RecursiveTask와 RecursiveAction은 모두 ForkJoinTask를 상속받습니다. 이 클래스는 Fork/join 프레임워크에서 처리되는 작업의 기본 클래스로서, Fork/join 스케줄링 및 관련 동작을 지원합니다.

 

아래는 간단한 Fork/join 프레임워크를 사용하는 예제입니다. 이 예제에서는 배열의 합을 계산하는 작업을 병렬로 처리합니다.

import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;

class SumTask extends RecursiveTask<Long> {
    private static final int THRESHOLD = 10;
    private long[] array;
    private int start;
    private int end;

    public SumTask(long[] array, int start, int end) {
        this.array = array;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if (end - start <= THRESHOLD) {
            // 작업을 직접 처리
            long sum = 0;
            for (int i = start; i < end; i++) {
                sum += array[i];
            }
            return sum;
        } else {
            // 작업을 두 개로 분할하여 처리
            int mid = (start + end) / 2;
            SumTask leftTask = new SumTask(array, start, mid);
            SumTask rightTask = new SumTask(array, mid, end);

            leftTask.fork();  // 왼쪽 부분 배열을 병렬로 처리
            long rightResult = rightTask.compute();  // 오른쪽 부분 배열은 현재 스레드에서 처리
            long leftResult = leftTask.join();  // 왼쪽 부분 배열의 결과를 기다림

            return leftResult + rightResult;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // 테스트 배열
        long[] array = new long[100];
        for (int i = 0; i < array.length; i++) {
            array[i] = i + 1;
        }

        // ForkJoinPool 생성
        ForkJoinPool forkJoinPool = new ForkJoinPool();

        // ForkJoinTask 생성 및 실행
        SumTask task = new SumTask(array, 0, array.length);
        long result = forkJoinPool.invoke(task);

        System.out.println("Sum: " + result);
    }
}

이 예제에서는 배열의 크기가 THRESHOLD 값보다 작을 때까지 작업을 나누어 계산하고, 그 이상이면 배열을 두 부분으로 나누어 각각을 병렬로 처리합니다. Fork/join 프레임워크는 이러한 작업을 효과적으로 분할하고 관리하여 병렬성을 높이는 데 도움을 줍니다.

 

With ChatGPT

'JAVA > 포스팅' 카테고리의 다른 글

자바 람다식 작성하기  (0) 2023.11.22
자바 람다식  (0) 2023.11.22
자바 쓰레드 join 프레임웍  (0) 2023.11.22
자바 쓰레드 volatile  (0) 2023.11.22
자바 쓰레드 Condition을 이용한 동기화  (0) 2023.11.22