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原始碼執行緒
- Kubernetes安裝之八:配置master之schedulerAST
- Android非同步框架RxJava 1.x系列(三) - 執行緒排程器SchedulerAndroid非同步框架RxJava執行緒
- Rxjava深入理解之自己動手編寫RxjavaRxJava
- Kubernetes原始碼分析之kube-scheduler原始碼
- golang 原始碼分析之scheduler排程器Golang原始碼
- 四. RxJava之基本原理RxJava
- kubernetes實踐之四十九:Scheduler原理分析
- 解剖 RxJava 之變換操作符RxJava
- Android開發之從零開始學RxJava 2.x(一)認識RxjavaAndroidRxJava
- 深入解析Scheduler
- RxJava練武場之——Token前置請求RxJava
- RxJava2系列之背壓策略(一)RxJava
- [20210325]SCHEDULER$_PROGRAM_ARG SCHEDULER$_JOB_ARG在哪裡.txt
- RxJava2原始碼解讀之 Map、FlatMapRxJava原始碼
- Oracle Database Scheduler整理OracleDatabase
- Kubernetes Scheduler淺析
- Oracle 任務管理之 ----program(程式)---scheduler(計劃)--Job(任務)Oracle
- RxJava小考題 -- Rxjava原始碼分析(一)RxJava原始碼
- RxJava操作符之組合操作符(六)RxJava
- Android技能樹 - Rxjava原始碼(1) 之 初步結構AndroidRxJava原始碼
- RxJava梳理RxJava
- Retrofit + RxJavaRxJava
- Quartz job scheduler 學習quartz
- Quartz框架中的Schedulerquartz框架
- 定時任務scheduler
- The Linux Scheduler: a Decade of Wasted CoresLinuxAST
- Kubernetes 漫遊:kube-scheduler
- Kubernetes scheduler學習筆記筆記
- Reactor中的Thread和SchedulerReactthread
- 關於golang的goroutine schedulerGolang
- Apache Dolphin Scheduler - Dockerfile 詳解ApacheDocker
- 大話RxJava:一、初識RxJava與基本運用RxJava
- 大話RxJava:三、RxJava的中級使用方法RxJava
- RxJava2系列實踐之倒數計時功能(三)RxJava
- 大話RxJava:二、輕鬆學原始碼之基礎篇RxJava原始碼
- RxJava練武場之——基於Observable網路框架的搭建RxJava框架