RxJava2 (三)线程切换源码阅读

当前版本 2.2.19
RxJava2 (一)订阅流程源码阅读
RxJava2 (二)取消订阅流程 dispose( ) 源码阅读
RxJava2 (三)线程切换源码阅读
RxJava2 (四)切换UI主线程源码阅读
RxJava2 (五)just操作符源码阅读
RxJava2 (六)map操作符源码阅读

代码示例
Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
        System.out.println("被观察者发射数据线程: " + Thread.currentThread().getId());
        emitter.onNext(100);
    }
});
// 被观察者发射消息设置为io线程
Observable<Integer> observable2 = observable1.subscribeOn(Schedulers.io());
// 观察者接收消息在Schedulers.newThread()创建的新线程中处理
Observable<Integer> observable3 = observable2.observeOn(Schedulers.newThread());
// 订阅
observable3
        .subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                System.out.println("onSubscribe");
            }
            @Override
            public void onNext(Integer integer) {
                System.out.println("onNext: " + integer);
                System.out.println("观察者接收数据线程: " + Thread.currentThread().getId());
            }
            @Override
            public void onError(Throwable e) {
                System.out.println("onError");
            }
            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });
概述
  1. observable1对象的真实类型为ObservableCreate,它持有一个ObservableOnSubscribe对象引用.
  2. observable2对象的真实类型为ObservableSubscribeOn,它持有一个ObservableCreate对象引用.
  3. observable3对象的真实类型为ObservableObserveOn,它持有一个ObservableSubscribeOn对象引用.
  4. .subscribe(Observer)方法后的API调用流程,流程脉络清楚再来看线程的切换就相当的简单了.
    • ObservableObserveOn.subscribe(Observer)
    • ObservableObserveOn.subscribeActual(Observer)
    • ObservableSubscribeOn.subscribe(ObserveOnObserver)
    • ObservableSubscribeOn.subscribeActual(ObserveOnObserver)⬇ 这里会切换被观察者发射数据的线程
    • ObservableCreate.subscribe(SubscribeOnObserver)
    • ObservableCreate.subscribeActual(SubscribeOnObserver)
    • ObservableOnSubscribe.subscribe(ObservableEmitter)
    • ObservableEmitter.onNext(100)
    • SubscribeOnObserver.onNext(t)
    • ObserveOnObserver.onNext(t)⬇ 这里会切换观察者接收数据的线程
    • Observer.onNext(t)
Schedulers

该类是一个工厂类,可以返回五种不同的父类类型为Scheduler的单例对象,分别是SINGLE,COMPUTATION,IO,TRAMPOLINE,NEW_THREAD.

public final class Schedulers {
    // 五种单例
    static final Scheduler SINGLE;
    static final Scheduler COMPUTATION;
    static final Scheduler IO;
    static final Scheduler TRAMPOLINE;
    static final Scheduler NEW_THREAD;
    // 静态代码块
    static {
        // SingleTask,ComputationTask,IOTask,NewThreadTask 都是Schedulers类中静态内部类
        // RxJavaPlugins.initSingleScheduler()最终返回的是一个SingleScheduler对象,其他的XXXTask也是一样返回XXXScheduler.
        SINGLE = RxJavaPlugins.initSingleScheduler(new SingleTask());
        COMPUTATION = RxJavaPlugins.initComputationScheduler(new ComputationTask());
        IO = RxJavaPlugins.initIoScheduler(new IOTask());
        TRAMPOLINE = TrampolineScheduler.instance();
        NEW_THREAD = RxJavaPlugins.initNewThreadScheduler(new NewThreadTask());
    }
    // SingleTask 实现了唯一的call()方法,
    // ComputationTask,IOTask,NewThreadTask 也是这种套路写出来的.
    static final class SingleTask implements Callable<Scheduler> {
        @Override
        public Scheduler call() throws Exception {
            // 返回的是SingleScheduler单例对象,下面看分析
            return SingleHolder.DEFAULT;
        }
    }
    // SingleHolder也是一个静态内部类,它会持有一个SingleScheduler对象的引用.
    static final class SingleHolder {
        static final Scheduler DEFAULT = new SingleScheduler();
    }
}
// RxJavaPlugins类
public final class RxJavaPlugins {
    // 该方法在Schedulers类中的静态代码块中被调用,并最终返回的是SingleScheduler对象
    @NonNull
    public static Scheduler initSingleScheduler(@NonNull Callable<Scheduler> defaultScheduler) {
        Function<? super Callable<Scheduler>, ? extends Scheduler> f = onInitSingleHandler;
        if (f == null) {
            // defaultScheduler 参数是SingleTask对象,实现了call()方法
            return callRequireNonNull(defaultScheduler);
        }
        return applyRequireNonNull(f, defaultScheduler);
    }
    
    @NonNull
    static Scheduler callRequireNonNull(@NonNull Callable<Scheduler> s) {
        try {
            // 最终这里调用了s.call(),返回了SingleScheduler对象.
            return ObjectHelper.requireNonNull(s.call(), "Scheduler Callable result can't be null");
        } catch (Throwable ex) {
            throw ExceptionHelper.wrapOrThrow(ex);
        }
    }
}
被观察者发射数据如何切换到IO线程中?
  1. Schedulers.io()获取IoScheduler单例对象
public final class Schedulers {
    static final Scheduler IO;
    public static Scheduler io() {
        // 直接返回IO
        return RxJavaPlugins.onIoScheduler(IO);
    }
    static {
        // IO真实的类型为IoScheduler.
        IO = RxJavaPlugins.initIoScheduler(new IOTask());
    }
}
  1. observable1.subscribeOn(Schedulers.io()),observable1对象的真实类型为ObservableCreate.subscribeOn()方法是在Observable类中实现的.
public abstract class Observable<T> implements ObservableSource<T> {
    // 将ObservableCreate对象与IoScheduler对象存储在ObservableSubscribeOn对象中,并返回
    public final Observable<T> subscribeOn(Scheduler scheduler) {
        return RxJavaPlugins.onAssembly(new ObservableSubscribeOn<T>(this, scheduler));
    }
}
  1. observable3调用subscribe()方法,会执行到ObservableSubscribeOn.subscribeActual(ObserveOnObserver)方法.
public final class ObservableSubscribeOn<T> extends AbstractObservableWithUpstream<T, T> {
    final Scheduler scheduler;// 这个就是IoScheduler对象
    public ObservableSubscribeOn(ObservableSource<T> source, Scheduler scheduler) {
        super(source);// 这个是ObservableCreate对象
        this.scheduler = scheduler;
    }
    @Override
    public void subscribeActual(final Observer<? super T> observer) {
        final SubscribeOnObserver<T> parent = new SubscribeOnObserver<T>(observer);
        // 这里最终会调用观察者的onSubscribe()方法
        observer.onSubscribe(parent);
        // scheduler.scheduleDirect(new SubscribeTask(parent)):这个方法很重要,会将ObservableCreate.subscribe()放入IO线程中执行.
        parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));
    }
}
  1. scheduler.scheduleDirect(new SubscribeTask(parent))ObservableCreate.subscribe()放入IO线程中执行
    首先看下new SubscribeTask(parent)
// SubscribeTask是一个Runnable对象,
final class SubscribeTask implements Runnable {
    private final SubscribeOnObserver<T> parent;
    SubscribeTask(SubscribeOnObserver<T> parent) {
        this.parent = parent;
    }
    @Override
    public void run() {
        // source:是ObservableCreate对象
        // parent:是SubscribeOnObserver对象
        source.subscribe(parent);
    }
}

scheduler.scheduleDirect()做了什么?

public abstract class Scheduler {
    public Disposable scheduleDirect(@NonNull Runnable run) {
        return scheduleDirect(run, 0L, TimeUnit.NANOSECONDS);
    }
    // scheduler.scheduleDirect()最终调用这里.
    public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
        // w是EventLoopWorker类型
        final Worker w = createWorker();
        final Runnable decoratedRun = RxJavaPlugins.onSchedule(run);
        // DisposeTask也是一个实现了Runnable接口的类, 它的run()最终会执行decoratedRun.run()
        DisposeTask task = new DisposeTask(decoratedRun, w);
        // schedule()最终将SubscribeTask.run()方法放入线程池中执行.
        w.schedule(task, delay, unit);
        return task;
    }
}
  1. 详细的看下scheduler.scheduleDirect()方法
    • createWorker()获取EventLoopWorker对象
       public final class IoScheduler extends Scheduler {
           // 这个单例就是创建线程的工厂,初始化IoScheduler时候会用到它
           static final RxThreadFactory WORKER_THREAD_FACTORY;
           // 线程池管理类
           static final CachedWorkerPool NONE;
           final AtomicReference<CachedWorkerPool> pool;
           static {
               WORKER_THREAD_FACTORY = new RxThreadFactory(WORKER_THREAD_NAME_PREFIX, priority);
               NONE = new CachedWorkerPool(0, null, WORKER_THREAD_FACTORY);
           }
           public IoScheduler() {
               this(WORKER_THREAD_FACTORY);
           }
           public IoScheduler(ThreadFactory threadFactory) {
               this.threadFactory = threadFactory;
               // NONE线程池管理对象
               this.pool = new AtomicReference<CachedWorkerPool>(NONE);
               start();
           }
           public Worker createWorker() {
                   // pool.get(): 获取NONE单例对象.
                   return new EventLoopWorker(pool.get());
           }
           static final class CachedWorkerPool implements Runnable {
               // 获取ThreadWorker对象, 该对象中持有线程池.
               ThreadWorker get() {
                   ...
                   ThreadWorker w = new ThreadWorker(threadFactory);
                   allWorkers.add(w);
                   return w;
               }
           }
           static final class EventLoopWorker extends Scheduler.Worker {
               EventLoopWorker(CachedWorkerPool pool) {
                   this.pool = pool;// 线程池管理类
                   this.tasks = new CompositeDisposable();
                   this.threadWorker = pool.get();//这里就能够获取一个线程池
               }
           }
       }
    
    • w.schedule(task, delay, unit);
       public final class IoScheduler extends Scheduler {
           static final CachedWorkerPool NONE;
           static final class EventLoopWorker extends Scheduler.Worker {
               // 该对象是由单例NONE中获取的
               private final ThreadWorker threadWorker;
               public Disposable schedule(@NonNull Runnable action, long delayTime, @NonNull TimeUnit unit) {
                   ...
                   // 下面看ThreadWorker中的scheduleActual()方法
                   return threadWorker.scheduleActual(action, delayTime, unit, tasks);
               }
           } 
       }
    
    • ThreadWorker.scheduleActual(),它最终调用的是NewThreadWorker.scheduleActual()
       public class NewThreadWorker extends Scheduler.Worker implements Disposable {
           private final ScheduledExecutorService executor;
           public NewThreadWorker(ThreadFactory threadFactory) {
               // 创建一个线程池
               executor = SchedulerPoolFactory.create(threadFactory);
           }
           // 最终将Runnable对象加入到这个线程池中执行.
           public Disposable scheduleDirect(final Runnable run, long delayTime, TimeUnit unit) {
               ScheduledDirectTask task = new ScheduledDirectTask(RxJavaPlugins.onSchedule(run));
               ...
               if (delayTime <= 0L) {
                   f = executor.submit(task);
               } else {
                   f = executor.schedule(task, delayTime, unit);
               }
               ...
           }
       }
    
    • 上面各个Runnable中的run()方法相互之间的调用流程
      1. ScheduledRunnable.run()
      2. DisposeTask.run()
      3. SubscribeTask.run()
      4. ObservableCreate.subscribe(SubscribeOnObserver)
      5. ObservableCreate.subscribeActual(SubscribeOnObserver)
      6. ObservableOnSubscribe.subscribe(ObservableEmitter)
      7. ObservableEmitter.onNext(100)⬇ 这里就开始在Schedulers.io()中的线程池里发射数据.
观察者接收数据是如何切换到Schedulers.newThread()创建的新线程中?
  1. Schedulers.newThread()获取NEW_THREAD单例对象
public final class Schedulers {
    static final Scheduler IO;
    public static Scheduler newThread() {
        // 直接返回NEW_THREAD
        return RxJavaPlugins.onNewThreadScheduler(NEW_THREAD);
    }
    static {
        // NEW_THREAD真实的类型为NewThreadScheduler
        NEW_THREAD = RxJavaPlugins.initNewThreadScheduler(new NewThreadTask());
    }
}
  1. observable2.observeOn(Schedulers.newThread()),observable2对象的真实类型为ObservableSubscribeOn.subscribeOn()方法是在Observable类中实现的.
    方法最终返回ObservableObserveOn对象,该对象中持有observable2NEW_THREAD单例对象.
public abstract class Observable<T> implements ObservableSource<T> {
    public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
        ...
        return RxJavaPlugins.onAssembly(new ObservableObserveOn<T>(this, scheduler, delayError, bufferSize));
    }
}
  1. 当使用ObservableEmitter.onNext(100)发射数据时,最终会被委托给它ObserveOnObserver.onNext(t),在概述中说过.
    在上面的第二步中知道ObservableObserveOn对象中持有NEW_THREAD单例对象,再看看下何时创建的ObserveOnObserver.
public final class ObservableObserveOn<T> extends AbstractObservableWithUpstream<T, T> {
    public ObservableObserveOn(ObservableSource<T> source, Scheduler scheduler, boolean delayError, int bufferSize) {
        super(source);
        this.scheduler = scheduler;// NEW_THREAD单例对象为NewThreadScheduler类型.
        this.delayError = delayError;
        this.bufferSize = bufferSize;
    }
    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        if (scheduler instanceof TrampolineScheduler) {
            source.subscribe(observer);
        } else {
            // 返回NewThreadWorker对象
            Scheduler.Worker w = scheduler.createWorker();
            // 它在这里创建的ObserveOnObserver对象.
            source.subscribe(new ObserveOnObserver<T>(observer, w, delayError, bufferSize));
        }
    }
    static final class ObserveOnObserver<T> extends BasicIntQueueDisposable<T>implements Observer<T>, Runnable {
        ObserveOnObserver(Observer<? super T> actual, Scheduler.Worker worker, boolean delayError, int bufferSize) {
            this.downstream = actual;
            this.worker = worker;// NewThreadWorker对象
            this.delayError = delayError;
            this.bufferSize = bufferSize;
        }
        // 用`ObservableEmitter.onNext(100)`发射的数据最后会走到这里.
        @Override
        public void onNext(T t) {
            ...
            schedule();
        }
        void schedule() {
            if (getAndIncrement() == 0) {
                // 看NewThreadWorker中,ObserveOnObserver是一个Runnable类型实现了run()方法
                worker.schedule(this);
            }
        }
    }
}
  1. worker.schedule(this);观察者接收数据的线程就是在这里切换的.
public class NewThreadWorker extends Scheduler.Worker implements Disposable {
    public NewThreadWorker(ThreadFactory threadFactory) {
        // 获取一个线程池
        executor = SchedulerPoolFactory.create(threadFactory);
    }
    public Disposable schedule(@NonNull final Runnable run) {
        return schedule(run, 0, null);
    }
    public Disposable schedule(@NonNull final Runnable action, long delayTime, @NonNull TimeUnit unit) {
        ...
        return scheduleActual(action, delayTime, unit, null);
    }
    // 最终将Runnable对象加入到这个线程池中执行.
    public Disposable scheduleDirect(final Runnable run, long delayTime, TimeUnit unit) {
        ScheduledDirectTask task = new ScheduledDirectTask(RxJavaPlugins.onSchedule(run));
        ...
        if (delayTime <= 0L) {
            // ObserveOnObserver中的run()方法将被调用,第五步分析.
            f = executor.submit(task);
        } else {
            f = executor.schedule(task, delayTime, unit);
        }
        ...
    }
}
  1. 回到ObserveOnObserver中的run()方法中.
public final class ObservableObserveOn<T> extends AbstractObservableWithUpstream<T, T> {
    static final class ObserveOnObserver<T> extends BasicIntQueueDisposable<T>implements Observer<T>, Runnable {
        // 第四步: executor.submit(task)将会在线程池的线程中执行run()方法.
        @Override
        public void run() {
            if (outputFused) {
                drainFused();
            } else {
                drainNormal();
            }
        }
         void drainNormal() {
             ...
             // 将消息存储在队列中
             final SimpleQueue<T> q = queue;
             // downstream就是用户创建的观察者对象.
             final Observer<? super T> a = downstream;
             // 取出消息
             v = q.poll();
             // 调用用户创建的Observer观察者对象的onNext(v)方法将消息传出.
             a.onNext(v);
             ..
         }
         void drainFused() {
             ...
             // 观察者中的onNext()被调用.
             downstream.onNext(null);
         }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RxJava中的flatMap操作符是一个非常常用的操作符,它可以将一个Observable发射的事件序列转换成多个Observables,然后将这些Observables发射的事件序列合并后再发射出去。 下面是flatMap操作符的源码解析: ```java public final <R> Observable<R> flatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper) { ObjectHelper.requireNonNull(mapper, "mapper is null"); return RxJavaPlugins.onAssembly(new ObservableFlatMap<>(this, mapper, false, Integer.MAX_VALUE, bufferSize())); } ``` 可以看到,flatMap操作符的实现是通过创建一个ObservableFlatMap对象来完成的。其中,mapper参数表示将原始Observable发射的事件转换成的新Observable,它是一个Function类型的参数,即接受一个T类型的参数并返回一个ObservableSource类型的结果。 ObservableFlatMap的构造函数如下所示: ```java ObservableFlatMap(ObservableSource<T> source, Function<? super T, ? extends ObservableSource<? extends R>> mapper, boolean delayErrors, int maxConcurrency, int bufferSize) { this.source = source; this.mapper = mapper; this.delayErrors = delayErrors; this.maxConcurrency = maxConcurrency; this.bufferSize = bufferSize; } ``` ObservableFlatMap的核心实现是在subscribeActual方法中完成的: ```java @Override public void subscribeActual(Observer<? super R> observer) { if (ObservableScalarXMap.tryScalarXMapSubscribe(source, observer, mapper)) { return; } source.subscribe(new FlatMapObserver<>(observer, mapper, delayErrors, maxConcurrency, bufferSize)); } ``` 在subscribeActual方法中,首先判断源Observable是否可以直接转换为ObservableScalarXMap,如果可以的话直接进行转换,否则创建一个FlatMapObserver对象并进行订阅。 FlatMapObserver是flatMap的核心实现类,它实现了Observer接口,并且在接收到源Observable发射的事件时,会先将事件转换成新的Observable,然后将新Observable的发射事件序列合并到一个新的Observable中,最后再将新的Observable发射出去。 ```java static final class FlatMapObserver<T, R> extends AtomicInteger implements Observer<T>, Disposable { // ... @Override public void onNext(T t) { ObservableSource<? extends R> o; try { o = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper returned a null ObservableSource"); } catch (Throwable e) { Exceptions.throwIfFatal(e); upstream.dispose(); onError(e); return; } if (cancelled) { return; } if (maxConcurrency != Integer.MAX_VALUE) { synchronized (this) { if (wip == maxConcurrency) { queue.offer(t); return; } wip++; } } o.subscribe(new InnerObserver(inner, delayErrors, this)); } // ... } ``` 在FlatMapObserver的onNext方法中,首先调用mapper将源Observable发射的事件转换成新的Observable,并进行非空检查。然后判断当前的并发度是否达到了最大值,如果达到了最大值,就将源Observable发射的事件放到队列中。否则,就将并发度加1,并订阅新Observable。 InnerObserver是FlatMapObserver的内部类,它实现了Observer接口,并在接收到来自新Observable的发射事件序列时,将它们合并到一个新的Observable中,并将新的Observable发射出去。 ```java static final class InnerObserver<R> implements Observer<R> { // ... @Override public void onNext(R t) { if (done) { return; } inner.onNext(t); } // ... } ``` 当所有的新Observable都完成后,FlatMapObserver会调用onComplete方法通知观察者。如果发生了异常,FlatMapObserver会调用onError方法通知观察者。同时,FlatMapObserver还实现了Disposable接口,可以通过dispose方法取消订阅。 综上所述,flatMap操作符的实现是比较复杂的,它通过创建ObservableFlatMap对象,并在subscribeActual方法中创建FlatMapObserver对象来完成转换操作。在FlatMapObserver中,它还需要实现对新Observable的订阅以及将新Observable发射的事件合并到一个新的Observable中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值