본문 바로가기
Rx

스케줄러 -1 (스케줄러의종류,뉴스레드스케줄러)

by 봄석 2018. 12. 27.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=


저자님의 블로그

https://brunch.co.kr/@yudong#info




스케줄러의 종류

RxJava는 다양한 스케줄러를 제공합니다. 

스케줄러 각각에 대해 알아보고 상황에맞게 어떤 스케줄러를 사용해야하는지 알아보겠습니다.


RxJava의 멋진점은 특정 스케줄러를 사용하다가 다른 스케줄러로 변경하기 쉽다는 것입니다.

마치 map() 함수를 한번더 호출하는 것처럼 새롭게 스케줄러를 추가하거나 기존의 스케줄러를 다른것으로 교체할 수 있습니다 .


RxJava에서 제공하는 스케줄러는 io.reactivex.schedulers 패키지 Schedulers 클래스의 

정적 팩토리 메소드로 생성합니다.



RxJava의 버전별 스케줄러 종류

스케줄러 

RxJava 2.x 

RxJava 1.x 

  뉴 스레드 스케줄러

newThread()

 newThread()

 싱글 스레드 스케줄러

single() 

지원 안 함 

계산 스케줄러 

computation() 

computation() 

IO 스케줄러 

io() 

io() 

트램펄린 스케줄러 

trampoline() 

trampoline() 

메인 스레드 스케줄러 

지원 안 함 

im 

 테스트 스케줄러

지원 안 함 

test() 




뉴스레드 스케줄러

뉴 스레드 스케줄러는 이름처럼 새로운 스레드를 생성합니다. 새로운 스레드를 만들어 어떤 동작을 실행하고 싶을 때 Schedulers.newThread()를 인자로 넣어주면 됩니다. 그럼 뉴 스레드 스케줄러는 요청을 받을 때 마다 새로운 스레드를 생성합니다.


RxJava의 스케줄러는 subscribeOn() 함수와 observeOn() 함수에 나눠서 적용할 수 있습니다.

두 함수의 개념을 정확하게 알지 못한 상태에서 사용하면 오히려 더 혼란스러울 수 있으니

우선 subscribeOn() 함수만 스케줄러를 적용하겠습니다.


뉴 스레드 스케줄러 활용 예

String[] orgs={"1","3","5"};
Observable.fromArray(orgs)
    .doOnNext(data->Log.v("Original data: "+ data))
    .map(data-> "<<"+ data +">>")
    .subscribeOn(Schedulers.newThread())
    .subscribe(Log::i);
CommonUtils.sleep(500);
        
Observable.fromArray(orgs)
    .doOnNext(data->Log.v("Original data : "+ data))
    .map(data->"##"+data+"##")
    .subscribeOn(Schedulers.newThread())
    .subscribe(Log::i);

 CommonUtils.sleep(500);



배열의 데이터는 두 Observable이 같습니다. 첫 번째 Observable은 '<<'과 '>>'을 추가했고

뉴 스레드 스케줄러를 subscribeOn() 함수로 지정했습니다. 두 번째 Observable은 양쪽에 '##'을 추가했고 뉴 스레드 스케줄러를 지정했습니다 . 첫 번째 Observable의 subscribe()와 두 번째 Observabl의 subscribe() 사이에는 500ms의 대기시간이 포함되어 있습니다.


실행결과

RxNewThreadScheduler-1 | Original data: 1
RxNewThreadScheduler-1 | value = <<1>>
RxNewThreadScheduler-1 | Original data: 3
RxNewThreadScheduler-1 | value = <<3>>
RxNewThreadScheduler-1 | Original data: 5
RxNewThreadScheduler-1 | value = <<5>>
RxNewThreadScheduler-2 | Original data : 1
RxNewThreadScheduler-2 | value = ##1##
RxNewThreadScheduler-2 | Original data : 3
RxNewThreadScheduler-2 | value = ##3##
RxNewThreadScheduler-2 | Original data : 5

RxNewThreadScheduler-2 | value = ##5##


뉴 스레드 스케줄러를 사용했기 때문에 첫 번째 Observable은 RxNewThreadScheduler-1  스레드에서 실행되었고 두 번째 Observable은 RxNewThreadScheduler-2 스레드에서 실행 되었습니다. 만약 또 다른 Observable이 있었다면 같은 형식의 3번 스레드에서 실행되었을 것입니다.


만약 각 Observable의 마지막에 있는 CommonUtils.sleep(500); 을제거하면 어떻게달라질까요 ?

-->실행결과가 나오지않는다?



댓글