RxJava之Scheduler

weixin_34208283發表於2016-11-22

排程器 Scheduler

如果你想給Observable操作符鏈新增多執行緒功能,你可以指定操作符(或者特定的Observable)在特定的排程器(Scheduler)上執行。

某些ReactiveX的Observable操作符有一些變體,它們可以接受一個Scheduler引數。這個引數指定操作符將它們的部分或全部任務放在一個特定的排程器上執行。

使用ObserveOn和SubscribeOn操作符,你可以讓Observable在一個特定的排程器上執行,ObserveOn指示一個Observable在一個特定的排程器上呼叫觀察者的onNext, onError和onCompleted方法,SubscribeOn更進一步,它指示Observable將全部的處理過程(包括髮射資料和通知)放在特定的排程器上執行。

排程器的種類

1、Schedulers.computation( ) : 用於計算任務,如事件迴圈或和回撥處理,不要用於IO操作(IO操作請使用Schedulers.io());預設執行緒數等於處理器的數量

2、Schedulers.from(executor):使用指定的Executor作為排程器

3、Schedulers.immediate( ):在當前執行緒立即開始執行任務

4、Schedulers.io( ):用於IO密集型任務,如非同步阻塞IO操作,這個排程器的執行緒池會根據需要增長;對於普通的計算任務,請使用Schedulers.computation();Schedulers.io( )預設是一個CachedThreadScheduler,很像一個有執行緒快取的新執行緒排程器

5、Schedulers.newThread( ):為每個任務建立一個新執行緒

6、Schedulers.trampoline( ):當其它排隊的任務完成後,在當前執行緒排隊開始執行


預設排程器

在RxJava中,某些Observable操作符的變體允許你設定用於操作執行的排程器,其它的則不在任何特定的排程器上執行,或者在一個指定的預設排程器上執行。下面的表格個列出了一些操作符的預設排程器:

操作符                                                                                   排程器

buffer(timespan)                                                                computation

buffer(timespan, count)                                                     computation

buffer(timespan, timeshift)                                                computation

debounce(timeout, unit)                                                    computation

delay(delay, unit)                                                                computation

delaySubscription(delay, unit)                                          computation

interval                                                                                 computation

repeat                                                                                   trampoline

replay(time, unit)                                                                  computation

replay(buffersize, time, unit)                                                computation

replay(selector, time, unit)                                                   computation

replay(selector, buffersize, time, unit)                                 computation

retry                                                                                         trampoline

sample(period, unit)                                                              computation

skip(time, unit)                                                                       computation

skipLast(time, unit)                                                                computation

take(time, unit)                                                                       computation

takeLast(time, unit)                                                                computation

takeLast(count, time, unit)                                                     computation

takeLastBuffer(time, unit)                                                      computation

takeLastBuffer(count, time, unit)                                           computation

throttleFirst                                                                              computation

throttleLast                                                                               computation

throttleWithTimeout                                                                 computation

timeInterval                                                                                immediate

timeout(timeoutSelector)                                                         immediate

timeout(firstTimeoutSelector, timeoutSelector)                     immediate

timeout(timeoutSelector, other)                                               immediate

timeout(timeout, timeUnit)                                                         computation

timeout(firstTimeoutSelector, timeoutSelector, other)            immediate

timeout(timeout, timeUnit, other)                                              computation

timer                                                                                            computation

timestamp                                                                                   immediate

window(timespan)                                                                      computation

window(timespan, count)                                                           computation

window(timespan, timeshift)                                                      computation


使用排程器

除了將這些排程器傳遞給RxJava的Observable操作符,你也可以用它們排程你自己的任務。下面的示例展示了Scheduler.Worker的用法:

worker = Schedulers.newThread().createWorker();
worker.schedule(new Action0() {

@Override
public void call() {
yourWork();
}

});
// some time later...
worker.unsubscribe();
}

遞迴排程器

要排程遞迴的方法呼叫,你可以使用schedule,然後再用schedule(this),示例:

worker = Schedulers.newThread().createWorker();
worker.schedule(new Action0() {

@Override
public void call() {
yourWork();
// recurse until unsubscribed (schedule will do nothing if unsubscribed)
worker.schedule(this);
}

});
// some time later...
worker.unsubscribe();

檢查或設定取消訂閱狀態

Worker類的物件實現了Subscription介面,使用它的isUnsubscribed和unsubscribe方法,所以你可以在訂閱取消時停止任務,或者從正在排程的任務內部取消訂閱,示例:

Worker worker = Schedulers.newThread().createWorker();
Subscription mySubscription = worker.schedule(new Action0() {

@Override
public void call() {
while(!worker.isUnsubscribed()) {
status = yourWork();
if(QUIT == status) { worker.unsubscribe(); }
}
}

});

Worker同時是Subscription,因此你可以(通常也應該)呼叫它的unsubscribe方法通知可以掛起任務和釋放資源了。

延時和週期排程器

你可以使用schedule(action,delayTime,timeUnit)在指定的排程器上延時執行你的任務,下面例子中的任務將在500毫秒之後開始執行:

someScheduler.schedule(someAction, 500, TimeUnit.MILLISECONDS);

使用另一個版本的schedule,schedulePeriodically(action,initialDelay,period,timeUnit)方法讓你可以安排一個定期執行的任務,下面例子的任務將在500毫秒之後執行,然後每250毫秒執行一次:

someScheduler.schedulePeriodically(someAction, 500, 250, TimeUnit.MILLISECONDS);

測試排程器

TestScheduler讓你可以對排程器的時鐘表現進行手動微調。這對依賴精確時間安排的任務的測試很有用處。這個排程器有三個額外的方法:

    advanceTimeTo(time,unit) 向前波動排程器的時鐘到一個指定的時間點

    advanceTimeBy(time,unit) 將排程器的時鐘向前撥動一個指定的時間段

    triggerActions( ) 開始執行任何計劃中的但是未啟動的任務,如果它們的計劃時間等於或者早於排程器時鐘的當前時間

相關文章