[Spring] 리액티브 프로그래밍 학습 2 - Executor Service와 Future, 그리고 CompletableFuture

Sihwan Kim·2024년 3월 15일

Reactive Programming

목록 보기
5/9

Executor Service

😎 쓰레드 풀을 이용해서 자원을 효율적으로 관리해서 비동기 작업을 실행 및 관리를 도와주는 서비스

ExecutorService의 생성

newSingleThreadExecutor

한 번에 하나의 작업만 실행하도록 단일 쓰레드로 구성

newFixedThreadPool

쓰레드 개수를 지정해주고 그 만큼의 쓰레드만 생성

newCachedThreadPool

사용가능한 쓰레드가 없으면 새로 생성하고, 일정시간 사용하지 않으면 삭제

newScheduledThreadPool

스케줄링 기능을 갖춘 고정 크기의 쓰레드풀을 생성.

newWorkStealingPool

work steal알고리즘을 사용하는 ForkJoinPool생성


Future

Future란?

비동기적 연산의 처리 결과를 표현하기 위해 사용된다. 비동기 처리가 완료되었는지 확인하고, 처리 완료를 기다리고, 처리 결과를 반환하는 메서드를 제공한다.
Future를 이용하면 멀티 스레드 환경에서 처리된 어떤 데이터를 다른 스레드에 전달할 수 있으며, Future는 내부적으로 Thread-Safe 하게 구현되어 있기 때문에 synchronized block(동기화 블록)을 사용하지 않아도 된다.
Future 객체는 작업이 완료될 때까지 기다렸다가 최종 결과를 얻는 데 사용하며, 때문에 지연 완료(pending completion) 객체라고도 한다.

Future를 반환받은 후에 Future인터페이스를 통해 isDone(), isCancelled() 등을 통해 작업상태를 확인할 수있고 작업이 완료되었다면, get()을 통해 값을 반환받을 수있다.

Future인터페이스의 단점

1. cancel을 제외하고 외부에서 future를 컨트롤 할 수 없다.

2. 반환된 결과를 get()을 통해 접근하기 때문에 비동기 처리가 어렵다.


CompletableFuture의 등장

Future를 외부에서 완료시킬 수 있어서 CompletableFuture라는 이름을 갖고 있다.
예를 들어, Future에서는 불가능했던 "몇 초 이내에 응답이 안 오면 기본값을 반환한다." 와 같은 작업이 가능해진 것이다.
즉, Future의 진화된 형태로써 외부에서 작업을 완료시킬 수 있을 뿐만 아니라 콜백 등록Future 조합 등이 가능하다는 것이다.

연산자

1. runAsync

public static CompletableFuture<Void> runAsync(Runnable runnable) {}

값을 반환하지 않는 비동기 작업 실행


2. supplyAsync

public static<U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {}

값을 반환하는 비동기 작업 실행


3. complete

CompletableFuture<Integer> future = new CompletabeFuture();
future.complete(1);

CompletableFuture가 완료되지 않았다면 주어진 값으로 채움.


4. isCompletedExceptionally

future.isCompletedExceptionally();

CompletableFuture가 예외로 인해 complete된것 인지 확인 가능.

Future에서는 isDoneisCanceled만 존재했기때문에 예외로인해 종료된 것을 알 수없었다.


5. allOf

여러 completableFuture를 모아서 하나의 completableFuture로 변환할 수있다.
모든 completableFuture가 완료되어야 done
Void를 반환


6. anyOf

여러 completableFuture를 모아서 하나의 completableFuture로 변환할 수있다.
하나의 completableFuture만 완료되면 done상태로 변경 후 완료된 future값 반환


💘 다음에는 실사용 코드를 정리해볼 예정이다.

0개의 댓글