프로젝트를 진행하면서 다른 분들 코드 보면서 이게 뭐지 싶어서 바로 찾아봐서 정리하는 글
✅ 동기 : 작업이 순차적으로 진행되는 것 한 작업이 시작되면 해당 작업이 완료될 때까지 다른 작업은 멈춤
✅ 비동기 : 작업의 완료 여부를 기다리지 않고 다른 작업을 실행할 수 있는 방식
CompletableFuture
CompletableFuture 특징
► 비동기 작업 실행
► 작업 콜백 지원
► 결과 처리 및 조합
► 예외 처리
► Timeout 지원
List<ProjectServiceResult> resultList = Collections.synchronizedList(new ArrayList<>());
//CompletableFuture 목록
ArrayList<CompletableFuture<Void>> doingList = new ArrayList<>();
✔️ Collections.synchronizedList() 메서드를 사용하여 동기화된 리스트를 만들어서, 여러 스레드에서 접근할 수 있도록 한다.
✔️ CompletableFuture<Void> 객체들의 리스트를 저장하기 위한 ArrayList
✔️ doingList 비동기적으로 실행되는 작업들의 CompletableFuture 객체를 담아두는 컨테이너 역할
if (reqs.contains(Consts.REQCONTAINS_VALUE)){
CompletableFuture<Void> reqValueCF = CompletableFuture.runAsync(()-> resultList.add(get결과가져올메소드(id)));
doingList.add(reqValueCF);
}
if (reqs.contains(Consts.REQCONTAINS_VALUE2)){
CompletableFuture<Void> reqValueCF2 = CompletableFuture.runAsync(()-> resultList.add(get결과가져올메소드2(id)));
doingList.add(reqValueCF2);
}
...
✔️ runAsync : 반환값이 없는 경우, 비동기로 작업 실행
✔️ supplyAsync : 반환값이 있는 경우, 비동기로 작업 실행
📌 REQCONTAINS_VALUE일 때, 'get결과가져올메소드(id)' 메서드를 실행한 값을 resultList에 저장, 저장한 값을 비동기적으로 실행한 것을 reqValueCF에 저장
//CompletableFuture 이용하여 모든 호출 동시 실행
CompletableFuture<Void> repCalls = CompletableFuture.allOf(doingList.toArray(new CompletableFuture[doingList.size()]));
repCalls.get(); //모두 실행 종료 대기
✔️ doingList에 저장된 여러 개의 CompletableFuture 객체들이 모두 완료될 때까지 기다리는 작업을 수행
✔️ CompletableFuture.allOf() 메서드는 CompletableFuture 객체들의 배열을 받아들여, 해당 배열에 있는 모든 CompletableFuture 객체들이 완료될 때까지 기다리는 새로운 CompletableFuture<void> 객체 생성
✔️ CompletableFuture.allOf(doingList.toArray(new CompletableFuture[doingList.size()]) doingCfList 리스트 요소들을 CompletableFuture 배열로 변환
✔️ repCalls.get() : CompletableFuture 객체가 완료될 때까지 대기
📌 이 코드에서는 반환값이 Void이므로, 작업이 성공적으로 완료되면 null을 반환
'CODING STUDY > JAVA' 카테고리의 다른 글
[Java] BooleanBuilder과 BooleanExpression (0) | 2024.09.27 |
---|---|
[Java] Spring Batch 버전 5로 업그레이드 (0) | 2024.05.30 |
[Java] SpringBoot3으로 버전 업그레이드 (API version) (0) | 2024.05.30 |
[Java] association, collection을 사용하여 데이터 가져오기 (0) | 2024.04.12 |
[Java] Json 값 중 원하는 값 추출하기 (0) | 2024.03.25 |