Scheduler를 통해 Thread를 효율적으로 관리할 수 있습니다.
observeOn()과 subscribeOn()을 통해 Scheduler를 설정할 수 있습니다.
●Scheduler 종류
Immediate Scheduler: Main Thread에서 실행됩니다. //2.x 버전에서는 사라졌습니다.
예) Observable.subscribeOn(Schedulers.immediate())
- Scheduler의 default값입니다.
Trampoline Scheduler: Immediate Scheduler랑 비슷합니다. 차이점은 Immediate는 현재 작업을 하고 있어도 주어진 작업을 즉시 실행하는 반면 Trampoline은 현재 작업이 끝나면 주어진 작업을 실행합니다.
예) Observable.subscribeOn(Schedulers.trampoline())
NewThread Scheduler: 새로운 Thread를 만들어서 실행합니다.
예) Observable.subscribeOn(Schedulers.newThread())
Computation Scheduler: CPU범위안에서 처리되는 간단한 연산이나 call back 처리를 위해 사용됩니다. 내부적으로 Thread Pool을 생성하는데 기본적으로 코어 갯수와 동일합니다. 각각의 Thread에는 Work Queue를 가지고 있어, 모든 코어가 점유된 상태이면 Thread의 Work Queue에 쌓이게 됩니다.
예) Observable.subscribeOn(Schedulers.computation())
I/O Scheduler: 네트워크 상의 요청처리 및 입/출력 작업 실행을 위한 스케줄러입니다. 새로운 구독자가 있을 때마다, Thread가 새로 생성되거나 전에 생성되었던(지금은 끝난) Thread가 재사용됩니다. 무제한 Thread Pool을 갖습니다. 웹서비스같이 무겁거나 응답없는 외부의존성이 있는 경우, I/O scheduler는 많은 Thread를 요구합니다. 하지만 실제로는, I/O Scheduler를 따르는 것이 거의 옳습니다.
예) Observable.subscribeOn(Schedulers.io())
●ExecutorService
ExecutorService를 이용하면 Thread Pool을 관리할 수 있는데, RxJava의 Scheduler로 ExecutorService를 이용할 수 있습니다.
예) ExecutorService threadPoolExec = Executors.newFixedThreadPool(4);
Observable.subscribeOn(Schedulers.from(threadPoolExec));
<newFixedThreadPool()>
newFixedThreadPool(n)는 고정된 갯수 n개의 Thread를 이용하여 Observable을 실행합니다.
n개 이상의 Observable이 들어오면 n개의 Thread가 생성되고, 처리가 끝난 Thread가 종료되면 새로운 Thread가 생성되어 Observable을 처리합니다. Observable의 갯수와 상관없이 일정한 갯수의 Thread로 처리가능합니다.
-하지만 100개의 Observable을 처리하려면 100개의 Thread를 생성하고 삭제해야 합니다.
-Thread를 생성/삭제하는 것은 함수를 실행하는 것보다 훨씬 비쌉니다.
<newWorkStealingPool()>
newWorkStealingPool(n)은 n개의 Thread를 생성/삭제하지 않고 n개 이상의 Observable을 처리할 수 있습니다.
각각의 Thread는 Work Queue를 가지고 있으며, Scheduler에서 Thread들의 Work Queue에 Observable을 분배해서 push해주면 Thread는 Work Queue에 있는 Observable을 pop하여 실행합니다.
참고:
https://tmondev.blog.me/220337036087?Redirect=Log&from=postView
'안드로이드 > ReactiveX' 카테고리의 다른 글
RxJava - Scheduler 연습 (0) | 2020.03.20 |
---|---|
뜨거운/차가운 Observable (0) | 2020.03.20 |
RxJava 기초 (0) | 2020.03.20 |