인생을 코딩하다.

ColpletableFuture 본문

Java

ColpletableFuture

Hyung1 2024. 1. 20. 20:13
728x90
반응형

ColpletableFuture

  • 2014년에 발표된 java8에소 처음 도입
  • 비동기 프로그래밍 지원
  • Lambda, Metho reference 등 java 8의 새로운 기능 지원

Method reference

  • :: 연산자를 이용해서 함수에 대한 참조를 간결하게 표현
  • method reference
  • statuc method reference
  • instance method reference
  • constructor method reference

 

ColpletableFuture 클래스

 

CompletableFuture
Future CompletionStage
비동기적인 작업을 수행 비동기적인 작업을 수행
해당 작업이 오한료되면 결과를 반환하는 인터페이스 해당 작업이 완료되면 결과를 처리하거나 다른 CmpletionStage를 연결하는 인터페이스

 

Future 인터페이스

 

Executor Service

  • 쓰레드 풀을 이용하여 비동기적으로 작업을 실행하고 관리
  • 별도의 쓰레드를 생성하고 관리하지 않아도 되므로, 코드를 간결하게 유지 가능
  • 쓰레드 풀을 이용하여 자원을 효율적으로 관리

ExecutorService Method

  • excute: Runnalbe 인터페이스를 구현한 작업을 쓰레드 풀에서 비동기적으로 실행
  • submit: Callable 인터페이스를 구현한 적업을 쓰레드 풀에서 비동기적으로 실행하고, 해당 작업의 결과를 Future<T> 객체로 반환
  • shutdown: ExecutorService를 종료. 더 이상 task를 받지 않는다.

 

Excutors - ExecutorService 생성

  • newSungleThreadExectutor: 단일 스레드로 구성된 스레드 풀을 생성. 한 번에 하나의 작업만 실행
  • newFixedThreadPool: 고정된 크기의 쓰레드 풀을 생성. 크기는 인자로 주어진 n과 동일
  • newCachedThreadPool: 사용 가능한 쓰레드가 없다면 새로 생성해서 작업을 처리하고, 있다면 재사용. 쓰레드가 일정시간 사용되지 않으면 회수
  • newScheduledThreadPool: 스케줄링 기능을 갖춘 고정 크기의 쓰레드 풀을 생성. 주기적이거나 지연이 발생하는 작업을 실행
  • newWorkStealngPool: work steal 알고리즘을 사용하는 ForkJoinPool을 생성.

FutureHelper

  • getFuture: 새로운 쓰레드를 생성하여 1을 반환
  • getFutureCompleteAfter1S : 새로운 쓰레드를 생성하고 1초 대기 후 1을 반환

Future: isDone(), isCancelled()

  • future의 상태를 반환
  • isDone: task가 완료되었다면, 원인과 상관없이 true 반환
  • isCancelled: task가 명시적으로 취소된 경우 true 반환

 

Future: get()

  • 결과를 구할 때까지 thread가 계속 block
  • future에서 무한 루프나 오랜 시간이 걸린다면 thread가 blocking 상태 유지

Future: get(long timeout, Timeunit unit)

  • 결과를 구할 때까지 timeout동안 thread가 block
  • timeout이 넘어가도 응답이 반환되지 않으면 TimeoutException 발생

Future: cancel(boolean mayInterruptIfRunning)

  • future의 작업 실행을 취소
  • 취소할 수 없는 상황이라면 false를 반환
  • mayInterruptIfRunning가 false라면 시작하지 않은 작업에 대해서만 취소

Future 인터페이스의 한계

  • cancel을 제외하고 외부에서 future를 컨트롤 할 수 없다.
  • 반환된 결과를 get()해서 접근하기 때문에 비동기 처리가 어렵다.

  • 완료되거나 에러가 발생했는지 구분하기 어렵다.

CompletionStage 인터페이스

CompletionStage 연산자 조합

  • 50개에 가까운 연산자들을 활용하여 비동기 task들을 실행하고 값을 변경하는 등 chaining을 이용한 조합 가능
  • 에러를 처리하기 위한 콜백 제공

ForkJoinPool - thread pool

  • CompleteableFuture는 내부적으로 비동기 함수들을 실행하기 위해 ForkJoinPoll을 사용
  • ForkJoinPool의 기본 size = 할당된 cpu 코어 -1
  • 데몬 쓰레드. main 쓰레드가 종료되면 즉각적으로 종료

ForkJoinPool - fork & join

  • task를 for를 통해서 subtask로 나누고
  • thread pool에서 steal work 알고리즘을 이용해서 균등하게 처리해서
  • join을 통해서 결과를 생성

CompletionStage 연산자

함수형 프로그래밍을 지원하기 위해 java8부터 도입

  • 1개의 추상 메서드를 갖고 있는 인터페이스
  • 함수를 1급 객체로 사용할 수 있다
    • 함수를 변수에 할당하거나 인자로 전달하고 반환값으로 사용 가능
  • Function, Consumer, Supplier, Runnable등
  • 함수형 인터페이스를 구현한 익명 클래스 람다식으로 변환 가능

CompletionStage 연산자와 연결

  • consumer - accept method -> thenAccept(Coinsumer action)
  • Function - apply method -> thenApplu(Function fn)
  • Function - compose method ( abstract method X) -> thenCompose(Function fn)
  • Runnable - run method -> thenRun(Runnable action)

thenAccept[Async]

  • Consumer를 파라미터로 받는다.
  • 이전 task로부터 값을 받지만 값을 넘기지는 않는다.
  • 다음 task에게 null이 전달된다.
  • 값을 받아서 action만 수행하는 경우 유용

Helper

  • finishedStage: 1을 반환하는 완료된 CompletableFuture 반환
  • runningStage: 1초를 sleep한 후 1을 반환하는 completableFuture

thenAccept[Async]의 실행 스레드

  • done 상태가 아닌 thenAccept는 callee(forkJoinPoll)의 쓰레드에서 실행
  • done 상태가 아닌 completionStage에 thenAccept를 사용하는 경우, callee를 block 할 수 있다.

 

thenAccept vs thenAcceptAsync

.. 작성중

728x90
반응형
Comments