CompletableFuture는 자바 8에서 도입된 java.util.concurrent 패키지의 클래스입니다. 비동기 프로그래밍을 쉽게 구현할 수 있도록 다양한 메서드와 기능을 제공합니다. CompletableFuture는 비동기 작업을 수행하고, 그 결과를 비동기적으로 처리할 수 있게 해줍니다.
1. CompletableFuture의 기본 개념
• 비동기 프로그래밍: 메인 스레드와는 별도로 작업을 수행하여 응답성을 높입니다.
• 비동기 작업의 관리: 작업의 완료 여부를 확인하고, 작업이 완료되면 후속 작업을 수행합니다.
• 콜백 등록: 작업이 완료되면 실행할 콜백 함수를 등록할 수 있습니다.
2. CompletableFuture의 생성
CompletableFuture 객체는 여러 가지 방법으로 생성할 수 있습니다.
• 직접 생성:
CompletableFuture<String> future = new CompletableFuture<>();
• 비동기 작업을 시작하면서 생성:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return "Hello, World!";
});
• 비동기 작업의 결과를 미리 정의하면서 생성:
CompletableFuture<String> future = CompletableFuture.completedFuture("Hello, World!");
3. 주요 메서드
비동기 작업 실행
• runAsync: 결과가 없는 작업을 비동기로 실행합니다.
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("Running asynchronously");
});
• supplyAsync: 결과가 있는 작업을 비동기로 실행합니다.
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return "Hello, World!";
});
결과 처리
• thenApply: 이전 작업의 결과를 받아서 변환합니다.
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(result -> result + ", World!");
• thenAccept: 이전 작업의 결과를 받아서 소비합니다.
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenAccept(result -> System.out.println(result));
• thenRun: 이전 작업의 결과를 사용하지 않고 실행할 작업을 정의합니다.
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenRun(() -> System.out.println("Task completed"));
예외 처리
• exceptionally: 예외가 발생했을 때 대체 값을 제공합니다.
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
if (true) throw new RuntimeException("Error occurred");
return "Hello";
}).exceptionally(ex -> "Recovered from error");
• handle: 정상적인 결과와 예외를 모두 처리합니다.
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
if (true) throw new RuntimeException("Error occurred");
return "Hello";
}).handle((result, ex) -> {
if (ex != null) return "Recovered from error";
return result;
});
여러 작업의 조합
• thenCombine: 두 비동기 작업의 결과를 조합합니다.
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);
• allOf: 여러 비동기 작업을 모두 완료할 때까지 기다립니다.
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
• anyOf: 여러 비동기 작업 중 하나라도 완료되면 결과를 반환합니다.
CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(future1, future2);
4. CompletableFuture 사용 예제
예제 1: 기본 사용
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(result -> result + ", World!")
.thenAccept(System.out::println);
}
}
예제 2: 예외 처리
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExceptionExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
if (true) throw new RuntimeException("Error occurred");
return "Hello";
}).exceptionally(ex -> "Recovered from error")
.thenAccept(System.out::println);
}
}
예제 3: 여러 작업의 조합
import java.util.concurrent.CompletableFuture;
public class CompletableFutureCombineExample {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);
combinedFuture.thenAccept(System.out::println);
}
}
요약
• 비동기 프로그래밍: CompletableFuture는 비동기 작업을 쉽게 관리하고 처리할 수 있는 다양한 기능을 제공합니다.
• 비동기 작업 실행: runAsync와 supplyAsync를 사용하여 비동기 작업을 시작합니다.
• 결과 처리: thenApply, thenAccept, thenRun 등의 메서드를 사용하여 비동기 작업의 결과를 처리합니다.
• 예외 처리: exceptionally, handle 메서드를 사용하여 예외를 처리합니다.
• 여러 작업의 조합: thenCombine, allOf, anyOf를 사용하여 여러 비동기 작업을 조합합니다.
'Java > Java 8' 카테고리의 다른 글
Executor 를 CompletableFuture와 같이 사용하는 방법 (0) | 2024.06.07 |
---|---|
자바 스트림의 중간 연산과 최종 연산 종류 (0) | 2024.06.07 |
스트림 API와 람다 표현식 소개 (0) | 2024.06.07 |
Optional in java 8 example 예제 (0) | 2023.08.30 |
[자바] Java 8 스트림 특징 (0) | 2020.12.18 |