동기 & 비동기
- 동기(sync)
: A라는 작업이 끝나는 동시에 B라는 작업을 시작
- 비동기(async)
: A라는 작업의 완료 여부와 상관없이 B라는 작업을 시작함
- 비동기 방식은 작업들이 서로의 작업 시작 및 종료 시간에 영향을 받지 않고, 별도의 작업 시작 / 종료 시간을 가짐
- 모든 비동기 방식은 멀티 스레드에서 작동
- 작업의 순서를 보장할 수 없게 됨
자바에서 비동기를 처리하는 방법
1. Callback
: 다른 주체에게 맡긴 작업이 끝나면 다른 주체 쪽에서 본 주체가 전해준 콜백 함수를 실행하는 방법
- 애플리케이션이 스레드에게 작업 처리를 요청한 후, 스레드가 작업을 완료하면 특정 메소드를 자동 실행하는 기법
cf) 블로킹 방식 vs 콜백 방식

▶ 블로킹 방식
: 작업 처리를 요청한 후, 작업이 완료될 때까지 블로킹됨
▶ 콜백 방식
: 작업 처리를 요청한 후, 결과를 기다릴 필요없이 다른 기능을 수행할 수 있음
- 작업 처리가 완료되면 자동적으로 콜백 메서드가 실행되어 결과를 알 수 있기 때문
- 콜백 함수
: 다른 함수에 인수로 전달되는 함수이며, 이벤트 후에 실행되는 것
-> 어떠한 행위를 하면 자동으로 실행되는 함수
1) CompletionHandler
- 비동기 I / O 작업의 결과를 처리하기 위한 목적으로 만들어짐
- 콜백 객체를 만드는데 사용됨
- completed()와 failed() 메서드가 있음
- completed() : 작업을 정상 처리 완료했을 때 호출되는 콜백 메서드
- failed() : 작업 처리 도중 예외가 발생했을 때 호출되는 콜백 메서드
2) 함수형 인터페이스
: 1개의 추상 메소드를 갖는 인터페이스
- 여러 개의 default method, static method는 있어도 됨
- 사용하는 이유)
- 자바의 람다식은 함수형 인터페이스로만 접근이 되기 때문
2. Future
: 다른 주체에게 작업을 맡긴 상태에서 본 주체 쪽에서 작업이 끝났는지 직접 확인
- 비동기 계산의 결과를 나타냄
- 계산이 완료되었는지 확인하고, 완료될 때까지 기다리고, 계산 결과를 검색하는 메서드가 제공됨
- 현재 스레드를 블로킹하지 않으면서도 비동기적으로 매우 중요한 계산을 할 수 있음
- 단점 )
- 외부에서 완료시킬 수 없고, get의 타임아웃 설정만으로만 완료 가능
- 블로킹 코드(get)을 통해서만 이후의 결과를 처리할 수 있음
- 여러 Future를 조합할 수 없음
- 여러 작업을 조합하거나 예외 처리할 수 없음
- 메소드 )
- isDone(), isCalceld()
- 블로킹없이 작업을 완료했는지의 여부만 확인
- get()
- 작업이 완료될 때까지 블로킹된 상태로 대기하는 방법
- 오래 걸리는 작업을 다른 주체에게 맡겨 두고, get()을 호출하기 전까지 이쪽에서 할 일을 하다가, 작업을 마치면 get()을 호출해 작업의 결과를 받아오는 식으로 사용
3. Completable Fufure
: Future의 한계를 극복하기 위해 등장
- Future은 다른 주체의 결과를 얻으려면 잠시라도 블로킹 상태에 들어가야 함
-> 이 한계를 해결하기 위해 나옴
- 이전 작업의 결과를 get()을 사용해 블로킹으로 가져올 필요 없이, then() 메소드를 통해 논블로킹을 유지하며 바로 사용할 수 있음
Reference
https://kindbear.tistory.com/74
[Java] 스레드풀 - 콜백 방식의 작업 완료 통보
이번에는 콜백(callback) 방식을 이용해서 작업 완료 통보를 받는 방법에 대해서 알아보자. 콜백이란 애플리케이션이 스레드에게 작업 처리를 요청한 후, 스레드가 작업을 완료하면 특정 메소드를
kindbear.tistory.com
'JAVA' 카테고리의 다른 글
14. Lambda & Functional Interface (0) | 2025.04.17 |
---|---|
13. 자바 8의 특징 (1) | 2025.04.17 |
11. Error & Exception 2 (0) | 2025.04.17 |
10. Error & Exception 1 (0) | 2025.04.16 |
9. Auto Boxing & UnBoxing (0) | 2025.03.28 |