JAVA

12. 비동기처리 문법 비교

ggomjiu 2025. 4. 17. 01:57

동기 & 비동기

- 동기(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

https://velog.io/@donsco/Java-%ED%95%A8%EC%88%98%ED%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

 

'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