작업을 병렬로 처리하고자 할 때 자바에서는 스레드풀(Thread Pool)을 사용합니다. 스레드풀은 미리 생성된 스레드들을 관리하여 작업을 분배하고 성능을 향상시킬 수 있습니다.
자바 8부터는 함수형 프로그래밍을 지원하기 위해 함수형 인터페이스(Functional Interface)가 도입되었습니다. 함수형 인터페이스는 하나의 추상 메소드를 가지고 있으며, 람다식을 이용하여 인터페이스의 익명 구현 객체를 생성할 수 있습니다.
함수형 인터페이스와 스레드풀을 함께 사용하는 예시를 살펴보겠습니다:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Consumer;
public class Example {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(5);
// Consumer 함수형 인터페이스를 사용하여 스레드풀에서 실행할 작업을 정의합니다.
Consumer<String> task = (name) -> {
System.out.println("Hello, " + name + "!");
};
// Runnable 객체를 생성하고 스레드풀에 작업을 제출합니다.
for (int i = 0; i < 10; i++) {
String name = "User " + i;
threadPool.execute(() -> task.accept(name));
}
// 스레드풀을 종료합니다.
threadPool.shutdown();
}
}
본 예시에서는 ExecutorService를 사용하여 스레드풀을 생성합니다. newFixedThreadPool() 메소드를 이용하여 최대 5개의 스레드를 가지는 스레드풀을 생성합니다.
Consumer 함수형 인터페이스를 사용하여 스레드풀에서 실행할 작업을 정의합니다. 이 예시에서는 문자열을 받아서 화면에 출력하는 작업을 수행하는 Consumer를 정의합니다.
10번의 루프를 돌며 Runnable 객체를 생성하고, 람다식을 사용하여 스레드풀에 작업을 제출합니다. 각 작업은 이름을 받아서 Consumer를 실행합니다.
마지막으로 스레드풀을 종료합니다. shutdown() 메소드를 호출하여 스레드풀에 대기 중인 작업들을 모두 끝마치고 스레드풀을 종료합니다.
이와 같이 자바에서는 함수형 인터페이스와 스레드풀을 함께 사용하여 병렬 처리를 구현할 수 있습니다.
참고 자료: Java 8 Functional Interfaces, Java Concurrency in Practice