RxJava之Scheduler
排程器 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( ) 開始執行任何計劃中的但是未啟動的任務,如果它們的計劃時間等於或者早於排程器時鐘的當前時間
相關文章
- 深入理解 RxJava2:Scheduler(2)RxJava
- react之schedulerReact
- RxJava原始碼解析(二)—執行緒排程器SchedulerRxJava原始碼執行緒
- 全面學習ORACLE Scheduler特性(7)使用Events之Scheduler丟擲的EventsOracle
- Rxjava深入理解之自己動手編寫RxjavaRxJava
- Android非同步框架RxJava 1.x系列(三) - 執行緒排程器SchedulerAndroid非同步框架RxJava執行緒
- Kubernetes安裝之八:配置master之schedulerAST
- golang 原始碼分析之scheduler排程器Golang原始碼
- 四. RxJava之基本原理RxJava
- Kubernetes原始碼分析之kube-scheduler原始碼
- Fair Scheduler與Capacity Scheduler介紹AI
- 解剖 RxJava 之變換操作符RxJava
- RxJava 原始碼解析之觀察者模式RxJava原始碼模式
- 解剖 RxJava 之過濾操作符RxJava
- RxJava操作符之Transforming ObservablesRxJavaORM
- RxJava2系列之背壓策略(一)RxJava
- RxJava練武場之——Token前置請求RxJava
- RxJava終章之實踐出真知(七)RxJava
- RxJava操作符之Creating ObservablesRxJava
- 深入解析Scheduler
- Oracle Scheduler概述Oracle
- kubernetes實踐之四十九:Scheduler原理分析
- Android開發之從零開始學RxJava 2.x(一)認識RxjavaAndroidRxJava
- RXJAVARxJava
- RxJava操作符之建立操作符(三)RxJava
- 全面學習ORACLE Scheduler特性(7)Scheduler丟擲的EventsOracle
- Oracle 任務管理之 ----program(程式)---scheduler(計劃)--Job(任務)Oracle
- Oracle Database Scheduler整理OracleDatabase
- Mysql 作業(Scheduler)MySql
- oracle scheduler任務Oracle
- Oracle DBMS_SCHEDULEROracle
- RxJava操作符之組合操作符(六)RxJava
- RxJava2原始碼解讀之 Map、FlatMapRxJava原始碼
- RxJava操作符之轉換操作符(四)RxJava
- RxJava操作符之過濾操作符(五)RxJava
- RxJava小考題 -- Rxjava原始碼分析(一)RxJava原始碼
- RxJava梳理RxJava
- Retrofit + RxJavaRxJava