일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- JPA
- redis
- thread
- list
- jvm
- K8s
- OS
- SpringBoot
- 토비의 스프링
- 백준
- IntellJ
- gradle
- Real MySQL
- Collection
- mysql
- spring
- 스트림
- 보조스트림
- Stack
- 자바 ORM 표준 JPA 프로그래밍
- GC
- Java
- 이스티오
- Kotlin
- 토비의 스프링 정리
- MSA
- 쿠버네티스
- 자바
- 스프링
- Stream
Archives
- Today
- Total
인생을 코딩하다.
ColpletableFuture 본문
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
반응형
'Java' 카테고리의 다른 글
I/O 관점에서 Blocking/Non-blocking (0) | 2024.01.20 |
---|---|
함수 호출 관점에서 동기/비동기, Blocking/Non-blocking (0) | 2024.01.20 |
[JAVA] 상수 풀(String Pool)은 GC가 될까? (0) | 2022.04.08 |
자바 병렬 프로그래밍 - 스레드 안전성(Thread Safe) (2) (0) | 2021.11.18 |
자바 병렬 프로그래밍 - 병렬 처리의 중요성 (1) (3) | 2021.11.07 |
Comments