본문으로 건너뛰기

Cuncurrent

1 자바의 동시성

  • 마이크로 서비스 애플리케이션은 여러 웹서비스에 접근해야한다.
  • 이들 서비스의 응답을 기다리는 동안 연산 블록 CPU 클로 낭비 없어야한다.
  • 애플리케이션 생산성 극대화를 위해 원격 서비스 데이터베이스 호출로 결과를 기다리는 스레드 블록하며 연산 자원 낭비 하는 일 피해야한다.
  • 자바는 이런 환경에서 사용할 수 있는 도구로 Future, CompletableFuture를 제공한다.
  • 최근 자바 9에는 리액티브 프로그래밍 개념을 따르는 Flow API가 추가되었다.

2. 자바의 동시성 진화

  • Runnable, Thread
  • Executor, ExecutorService, Callable
  • 자바5: Future
  • 자바8: CompletableFuture
  • 자바9: Flow API

3. Runnable, Thread

4 Executor, ExecutorService, Callable

5 Future

  • 자바5에서부터 미래의 어느 시점에 결과를 얻는 모델에 활용할 수 있도록 Future 인터페이스를 제공합니다.
  • 비동기 계산을 모델링 하는데 Future를 사용할 수 있습니다.
  • Future를 이용하려면 오래 걸리는 작업을 Callable로 감싸서 ExecutorService에 제출합니다.
  • 이 후 비동기 작업이 완료되는 동안 다른 작업을 수행할 수 있습니다.
  • 오래 걸리는 작업의 결과가 필요한 시점에 Future.get() 메소드를 호출하여 결과를 가져옵니다.
    • 이미 결과가 준비되어 있다면 즉시 결과를 리턴합니다.
    • 결과가 준비되어 있지 않다면 호출 스레드가 블록되며 작업이 완료될 때까지 스레드를 블록시킵니다.

5.1 Future의 한계

  • Future 인터페이스는 비동기 계산이 끝났는지 확인할 수 있는 isDone 메서드, 계산이 끝나길 기다리는 메서드, 결과를 회수하는 메서드를 제공합니다.
  • 하지만 이 메서드로 간결한 동시 실행 코드를 구현하기 충분하지 않습니다.
  • Future를 사용하면 여러 Future의 결과가 있을 때 이들의 의존성을 표현하는 것이 어렵습니다.
  • Future를 사용하면 아래와 같은 기능을 작성하는 것이 어렵습니다.
    • 두 개의 비동기 계산 결과를 하나로 합친다.
    • Future 집합이 실행하는 모든 태스크의 완료를 기다린다.
    • Future 집합에서 가장 빨리 완료되는 태스크를 기다렸다가 결과를 얻는다.
    • Future 완료 동작에 반응한다. 즉 결과를 기다리면서 블록되지 않고 결과가 준비되었다는 알림을 받은 다음에 Future의 결과로 원하는 추가 동작을 한다.
  • 이를 해결하기 위해 자바8에서 CompletableFuture가 추가되었습니다.

6 CompletableFuture

  • 자바8에서 CompletableFuture는 Future의 한계를 극복하기 위해 추가되었습니다.
  • CompletableFuture는 Future의 기능을 확장하고 비동기 계산을 모델링하는데 사용할 수 있습니다.