반응형
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는 컬렉션 데이터 병럴 처리에 유용할 것이다.
반응형
'개발 > JAVA' 카테고리의 다른 글
[Java] for문 vs Stream 성능 비교 및 차이점 정리 (1) | 2025.04.14 |
---|---|
파일 조각 업로드 (Chunked Upload) (0) | 2025.01.07 |
[Java mail] MIME 구조 (0) | 2024.05.28 |
[JavaMail]메일 프로토콜 POP3와 SMTP, IMAP (1) | 2024.04.29 |
[JavaMail] 메일 헤더 (Mail Headers), 메일 내용 (Mail Content) (0) | 2024.02.19 |