RxJava 和 RxAndroid 五(线程调度)补充研究

本文通过两个示例深入探讨RxJava中的线程调度机制。即使指定了生产者线程,若在emitter发射时使用新线程,加工线程与消费者线程将跟随此新线程执行。代码实例展示了不同线程配置下任务执行的线程环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程调度文章:https://blog.youkuaiyun.com/rnZuoZuo/article/details/83830391

研究结论:默认情况下,不指定生产者线程和消费者线程,运行在当前线程,

但是如果emitter在发射的时候放在一个新的线程里,那么加工线程和消费线程保持和这个新的线程一致

测试代码:

public class MainDemo {
    public static void main(String[] args){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(final ObservableEmitter<Integer> emitter) throws Exception {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        emitter.onNext(1);
                        emitter.onComplete();
                    }
                }).start();
                System.out.println( "rx_call_1:" + Thread.currentThread().getName()  );
            }
        })

                . map(new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer cmsResponse) throws Exception {
                System.out.println( "rx_call_map:" + Thread.currentThread().getName()  );
                return 2;
            }
        }).
                subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Integer integer) {
                System.out.println( "rx_call_2:" + Thread.currentThread().getName()  );

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

    }
}

 

下面虽然指定里生产者线程 subscribeOn(Schedulers.io()),但是加工线程和消费线程还是跟随emiter.onnext执行的线程

 

public class MainDemo {
    public static void main(String[] args){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(final ObservableEmitter<Integer> emitter) throws Exception {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        emitter.onNext(1);
                        emitter.onComplete();
                    }
                }).start();
                System.out.println( "rx_call_1:" + Thread.currentThread().getName()  );
            }
        })

                . map(new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer cmsResponse) throws Exception {
                System.out.println( "rx_call_map:" + Thread.currentThread().getName()  );
                return 2;
            }
        }) .subscribeOn(Schedulers.io())
                .subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Integer integer) {
                System.out.println( "rx_call_2:" + Thread.currentThread().getName()  );

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值