본문 바로가기

개발/JAVA

[JAVA] 스레드 병렬 처리 방법

반응형

 

ExecutorService를 이용한 병렬처리

 

  • ExcutorService를 사용하면 스레드를 직접 관리하지 않고도 병렬 처리를 수행할 수 있다. 아래 예제는 스레드 풀을 생성하고, 병렬로 작업을 진행한다.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ParallelProcessingExample {

    public static void main(String[] args) {
        // 스레드 풀 생성
        ExecutorService executor = Executors.newFixedThreadPool(4);

        // 병렬로 실행할 작업 정의
        Runnable task1 = () -> {
            System.out.println("Task 1 - " + Thread.currentThread().getName());
        };

        Runnable task2 = () -> {
            System.out.println("Task 2 - " + Thread.currentThread().getName());
        };

        Runnable task3 = () -> {
            System.out.println("Task 3 - " + Thread.currentThread().getName());
        };

        // 작업 제출
        executor.submit(task1);
        executor.submit(task2);
        executor.submit(task3);

        // ExecutorService 종료
        executor.shutdown();

        try {
            // 모든 작업이 완료될 때까지 대기
            executor.awaitTermination(1, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

 

ForkJoinPool을 이용한 병렬처리

 

  • ForkJoinPool은 재귀적은 작업을 병렬로 처리하는 데 적합하다. 아래 예제는 RecursiveTask를 실행하여 병렬로 피보나치 수를 계산한다.
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class ParallelFibonacci extends RecursiveTask<Integer> {
    private final int n;

    public ParallelFibonacci(int n) {
        this.n = n;
    }

    @Override
    protected Integer compute() {
        if (n <= 1) {
            return n;
        }

        ParallelFibonacci f1 = new ParallelFibonacci(n - 1);
        ParallelFibonacci f2 = new ParallelFibonacci(n - 2);

        // 병렬로 작업 실행
        f1.fork();
        int result = f2.compute() + f1.join();

        return result;
    }

    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        int number = 10;  // 예제 피보나치 수
        ParallelFibonacci task = new ParallelFibonacci(number);

        int result = forkJoinPool.invoke(task);
        System.out.println("Fibonacci of " + number + " is " + result);
    }
}

 

 

Parallel Streams를 이용한 병렬처리
  • Java 8의 스트림 API를 사용하면 컬렉션 데이터를 병렬로 처리할 수 있다. 아래 예제는 리스트의 모든 요소를 병렬로 출력한다.
import java.util.Arrays;
import java.util.List;

public class ParallelStreamExample {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("one", "two", "three", "four", "five");

        // 병렬 스트림 사용
        list.parallelStream().forEach(item -> {
            System.out.println(item + " - " + Thread.currentThread().getName());
        });
    }
}

 

 

각 상황에 맞는 것을 선택하여 병렬처리를 구현할 수 있으며,

 

ExecutorService는 일반적인 병럴 처리에, 

ForkJoinPool은 재귀적은 병렬 작업에,

Parallel Streams는 컬렉션 데이터 병럴 처리에 유용할 것이다.

 

반응형