作用

让操作符(或者特定的Observable)在指定的调度器(Scheduler)上运行,就可以在链式调用中实现多线程任务。
有些Observable的操作符会接收一个Scheduler(调度器)参数,这个参数会将操作符的部分或者全部任务放在指定的调度器上执行。
默认情况下,Observable和Operators调用链上的任务,还有通知Observer的工作都会在subscribe方法调用的线程进行。SubscribeOn操作符会指定Observable在哪个调度器上执行。ObserveOn操作符会告诉Observable在哪个调度器上通知Observer。
如下图所示:subscribeOn(蓝色)指定了Observable工作在蓝色调度器上。observeOn(橙色)指定了调用链后续任务在橙色调度器上执行,而且可以手动再次切换(粉**紫色**)。
image.png

调度器的种类

注释:can kaoRxJava2,版本号2.2.19。

调度器类型 效果
Schedulers.computation( ) 用于计算任务,如事件循环或和回调处理。不要用于IO操作(IO操作请使用Schedulers.io());默认线程数等于处理器的数量。
Schedulers.from(executor) 使用指定的Executor作为调度器
Schedulers.io( ) 用于IO密集型任务,如异步阻塞IO操作,这个调度器的线程池会根据需要增长;对于普通的计算任务,请使用Schedulers.computation();Schedulers.io( )默认是一个CachedThreadScheduler,很像一个有线程缓存的新线程调度器.
Schedulers.newThread( ) 为每个任务创建一个新线程。
Schedulers.trampoline( ) 当其它排队的任务完成后,在当前线程排队开始执行。
Schedulers.single() 共享的单个线程。

调度器的使用

除了用在Observable和操作符上,我们也可以独立使用Scheduler。用法如下:

  1. Scheduler.Worker worker = Schedulers.newThread().createWorker();
  2. worker.schedule(new Runnable() {
  3. @Override
  4. public void run() {
  5. //TODO
  6. }
  7. });
  8. //TODO
  9. worker.dispose();

还可以延时调度

  1. Scheduler.Worker worker = Schedulers.newThread().createWorker();
  2. worker.schedule(new Runnable() {
  3. @Override
  4. public void run() {
  5. //TODO
  6. }
  7. },100,TimeUnit.SECONDS);
  8. //TODO
  9. worker.dispose();

再加上周期性的执行

  1. Scheduler.Worker worker = Schedulers.newThread().createWorker();
  2. worker.schedulePeriodically(new Runnable() {
  3. @Override
  4. public void run() {
  5. //TODO
  6. }
  7. },10,100,TimeUnit.SECONDS);
  8. //TODO
  9. worker.dispose();

参考资料

http://reactivex.io/documentation/scheduler.html