[java] 자바 함수형 인터페이스와 스레드풀을 함께 사용하는 예시는 어떤 것이 있나요?

작업을 병렬로 처리하고자 할 때 자바에서는 스레드풀(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