Page 29 -
P. 29
RxJava에서는 개발자가 직접 스레드를 관리하지 않게 각 처리 목적에 맞춰 스레드를 관리하는
스케줄러(scheduler)를 제공합니다. 이 스케줄러를 설정하면 어떤 스레드에서 무엇을 처리할지 제
어할 수 있습니다. 1
스케줄러는 데이터를 생성해 통지하는 부분과 데이터를 받아 처리하는 부분에 지정할 수 있습니
다. 전자는 데이터 생성의 기본이 되는 생산자(Flowable/Observable)를 말하는 것으로, 생성 RxJava의 기본
메서드에서 생성한 Flowable/Observable이 데이터 통지를 어떤 스케줄러에서 처리할지를 제
어합니다. 후자는 데이터의 필터나 변환을 하는 메서드와 소비자(Subscriber/Observer) 등이 데
이터의 수신 처리를 어느 스케줄러에서 할지를 제어합니다. 이러한 구조로 RxJava는 쉽게 비동기
처리를 할 수 있습니다.
하지만 RxJava로 비동기 처리를 할 때도 문제가 발생하지 않게 개발자는 주의를 기울여야 합니
다. 앞서 설명한 바와 같이 데이터를 통지하는 측과 받는 측은 데이터 통지 시에만 데이터를 주고
받아야 하며 그 이외의 요인으로 서로의 행동에 영향을 주지 않아야 합니다.
예를 들어, 생산자와 소비자 사이에서 이루어지는 처리를 외부 변수를 참조해 바꾸면 비동기 처리
에 영향을 주게 됩니다. 다음 예제는 변수를 참조해 데이터를 받았을 때 처리를 변수에 따라 바꾸
고 있습니다.
예제 1-10 외부 영향을 받는 예제 _ L10_EffectedSample.java
// 계산 방법을 나타내는 enum 객체
private enum State {
ADD, MULTIPLY;
};
// 계산 방법
private static State calcMethod;
public static void main(String[] args) throws Exception {
// 계산 방법을 덧셈으로 설정한다
calcMethod = State.ADD;
Flowable<Long> flowable =
// 300밀리초마다 데이터를 통지하는 Flowable을 생성한다
Flowable.interval(300L, TimeUnit.MILLISECONDS) // 1
// 7건까지 통지한다
.take(7) // 2
// 각 데이터를 계산한다
037
RxJava 리액티브 프로그래밍(본문)최종.indd 37 2019-03-26 오전 11:26:31