책/모던 자바 인 액션
15장 CompletableFuture와 리액티브 프로그래밍 컨셉의 기초
sami355
2024. 6. 23. 12:19
- 동시성은 단일 코어 머신에서 발생할 수 있는 프로그래밍 속성으로 실행이 서로 겹칠 수 있느 ㄴ반면 병렬성은 병렬 실행을 하드웨어 수준에서 지원한다.
15.1 동시성을 구현하는 자바 지원의 진화
- 매쉬업 어플리케이션 즉, 다양한 웹 서비스를 이용하고 이들 정보를 실시간으로 조합해 사용자에게 제공하거ㅏ 추가 웹 서비스를 통해 제공하는 종류의 애플리케이션 -> 리액티브 프로그래밍
- 다시 말해 스트림을 이용해 스레드 사용패턴을 추상화할 수 있다.
- 주어진 프로그램에서 사용할 최적의 자바 스레드 개수는 사용할 수 있는 하드웨어 코어의 개수에 따라 달라진다.
- 프로그래머는 태스크(Runnable이나 Callable)를 제공하면 스레드가 이를 실행한다.
- 핵심은 블록할 수 있는 태스크는 스레드 풀에 제출하지 말아야 한다는 것이지만 항상 이를 지킬 수 있는 것은 아니다.
- 스레드 실행은 메서드를 호출한 다음의 코드와 동시에 실행되므로 데이터 경쟁 문제를 일으키지 않도록 주의해야 한다.
- 기존 실행중이던 스레드가 종료되지 않은 상황에서 자바의 main() 메서드가 반환하면 어떻게 될까? 다음과 같은 두 가지 방법이 있는데 어느 방법도 안전하지 못하다.
- 애플리케이션을 종료하지 못하고 모든 스레드가 실행을 끝날 때까지 기다린다.
- 애플리케이션 종료를 방해하는 스레드를 강제종료시키고 애플리케이션을 종료한다.
- 자바 스레드는 setDaemon() 메서드를 이용해 데몬 또는 비데몬으로 구분시킬 수 있다.
- 데몬 스레드는 애플리케이션이 종료될 때 강제 종료되므로 디스크의 데이터 일관성을 파괴하지 않는 동작을 수행할 때 유용하게 활용할 수 있는 반면, main()메서드는 모든 비데몬 스레드가 종료될 때까지 프로그램을 종료하지 않고 기다린다.
15.2 동기 API와 비동기 API
- 두 가지 단계로 병렬성을 이용할 수 있다
- 첫 번째로 외부 반복을 내부 반복으로 바꿔야 한다.
- 리액티브 형식의 비동기 API는 자연스럽게 일련의 값을, Future 형식의 API는 일회성의 값을 처리하는 데 적합하다.
- 스레드 풀에서 잠을 자는 태스크는 다른 태스크가 시작되지 못하게 막으므로 자원을 소비한다는 사실을 기억하자(운영 체제가 이들 태스크를 관리하므로 일단 스레드로 할당된 태스크는 중지시키지 못한다.)
- Future를 구현한 CompletablFuture에서는 런타임 get() 메서드에 예외를 처리할 수 있는 기능을 제공하며 예외에서 회복할 수 있도록 exceptionally() 같은 메소드도 제공한다.